package org.westos.反射博客练习;
/*
* 什么是反射?
* 反射就是通过获取class字节码文件对象/Class类对象,
* 来获取类对象的成员变量,构造方法,成员方法
* 创建Class类对象的三种方式:
* 1.Class.forName(包名.类名)
* 2.对象名.getClass()
* 3.类名.class
* */
public class Text1 {
public static void main(String[] args) throws ClassNotFoundException {
Student s1 =new Student();
Student s2 = new Student();
Class c1 = Class.forName("org.westos.反射博客练习.Student");
Class c2 = s2.getClass();
Class c3 = Student.class;
System.out.println(c1==c2);
System.out.println(c3==c2);
System.out.println(c1==c3);
}
}
package org.westos.反射博客练习;
import java.lang.reflect.Constructor;
//通过反射获取构造方法
public class Text2 {
public static void main(String[] args) throws Exception {
//创建Class类对象
Class c = Class.forName("org.westos.反射博客练习.Student");
//获取构造方法,返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
Constructor[] cons = c.getConstructors();
//遍历
for(Constructor con:cons) {
System.out.println(con);
}
// public org.westos.反射博客练习.Student(java.lang.String,int)
// public org.westos.反射博客练习.Student()
System.out.println("-------------------------------------------");
//下面这个方法可以获取公共与私有的构造方法
Constructor[] dcons = c.getDeclaredConstructors();
//遍历
for(Constructor dcon:dcons) {
System.out.println(dcon);
}
System.out.println("----------------------------------------------");
//通过公共构造方法创建对象
//通过反射创建对象,需要先获取单个的构造方法
Constructor c1 = c.getConstructor(String.class,int.class);
//调用Constructor的newInstance()方法,对于带参构造在括号中传入参数,无参则不传入
Object obj1 = c1.newInstance("张三",12);
System.out.println(obj1);
System.out.println("-----------------------------------------------");
//通过反射获取私有的构造方法再创建对象
//获取单个的构造方法,因为为私有,使用declearConstructor()
Constructor dc1 = c.getDeclaredConstructor(String.class);
//public void setAccessible(boolean flag),将此对象的 accessible 标志设置为指示的布尔值。
//该方法由Constructor的父类提供
//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
//值为 false 则指示反射的对象应该实施 Java 语言访问检查。
dc1.setAccessible(true);
Object obj2 = dc1.newInstance("李四");
System.out.println(obj2);
}
}
package org.westos.反射博客练习;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/**
* 通过反射获取成员变量
* */
public class Text3 {
public static void main(String[] args) throws Exception {
//创建Class类对象
Class c = Class.forName("org.westos.反射博客练习.Student");
//创建Constructor对象
Constructor con = c.getConstructor();
//通过反射创建对象
Object obj = con.newInstance();
//获取Filed公共成员变量,返回一个数组
//注意对于那些没有权限修饰符的成员变量(如String add),Java虽然默认提供public,但是在这里并不会返回它
Field[] f1 = c.getFields();
for(Field f:f1) {
System.out.println(f);
}
System.out.println("-------------------------------");
//获取Filed公共与私有的成员变量
//getDeclearFields()方法可以返回没有权限修饰符的成员变量
Field[] f2 = c.getDeclaredFields();
for(Field f:f2) {
System.out.println(f);
}
System.out.println("----------------------------------");
//通过Field类修改对象的成员变量
//公共成员变量
Field age = c.getField("age");
//传入参数
//public void set(Object obj, Object value),将指定对象变量上此 Field对象表示的字段设置为指定的新值。
age.set(obj,12);
System.out.println(obj);
System.out.println("-------------------------------------");
//私有成员变量
Field name = c.getDeclaredField("name");
//取消访问权限检查
name.setAccessible(true);
//传入参数
name.set(obj, "张三");
System.out.println(obj);
}
}
package org.westos.反射博客练习;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
//通过反射获取返回值
public class Text4 {
public static void main(String[] args) throws Exception {
//创建Class类对象
Class c = Class.forName("org.westos.反射博客练习.Student");
//创建对象
Constructor con = c.getConstructor(String.class,int.class);
Object obj = con.newInstance("张三",12);
//获取公共方法
Method[] m1 = c.getMethods();
for(Method m:m1) {
System.out.println(m);
}
System.out.println("------------------------------");
//获取公共与私有的方法
Method[] m2 = c.getDeclaredMethods();
for(Method m:m2) {
System.out.println(m);
}
System.out.println("-----------------------------------");
//调用方法
//公共方法
Method method1 = c.getMethod("method1");
method1.invoke(obj);
//私有方法
Method method2 = c.getDeclaredMethod("method2", String.class);
//取消访问权限检查
method2.setAccessible(true);
//调用
Object objname = method2.invoke(obj, "张三");
System.out.println(objname);
}
}
package org.westos.反射博客练习;
import java.lang.reflect.Method;
import java.util.ArrayList;
//使用反射在加入泛型的ArrayList集合中传入,其他类型的数据
public class Text5 {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list = new ArrayList<>();
Class c = Class.forName("java.util.ArrayList");
Method add = c.getMethod("add", Object.class);
//添加String类型数据
add.invoke(list, "hello");
add.invoke(list, "world");
add.invoke(list,"Java");
//输出集合
System.out.println(list);
//[hello, world, Java]
}
}
自定义类
package org.westos.反射博客练习;
public class Student {
private String name;
public int age;
String add;
//set/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//公共无参构造
public Student() {
super();
}
//公共带参构造
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//私有带参构造
private Student(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
//公共的,没有返回值,没有传入参数的方法
public void method1() {
System.out.println("公共的,没有返回值,没有传入参数的方法");
}
//私有的,还有返回值,有传入参数的方法
private String method2(String name) {
return "私有的,还有返回值,有传入参数的方法 "+name;
}
}