JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
@Test//获取Class --范围:所有的字节码文件
public void test1() throws ClassNotFoundException {
//方式1--通过类名
Class c=Dog.class;//Dog.java编译后的字节码文件
Class c1=Book.class;//Book.java编译后的字节码文件
//方式2--通过对象
Class c3 = new Dog().getClass();
//方式3--通过类路径
Class c4 = Class.forName("reflect1.Book");
}
无参创建对象:
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.帮Dog调用无参构造
Dog dog = c.newInstance();
有参构造器创建对象:
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取有参构造的管理对象--2个参数的那个 getConstructor(构造器的参数类型.class) //得到设定构造器
Constructor<Dog> con = c.getDeclaredConstructor(String.class,int.class);
//3.帮助Dog类调用有参构造
con.setAccessible(true) //确认获得私有
Dog dog = con.newInstance("旺财",2);
调用属性:
field=c.getDeclaredField(属性名) //获得类中的属性管理对象
field.setAccessible(true) //确认获得私有
field.set(dog,修改属性值)
调用方法:
mothed=c.getDeclaredMothed(方法名,参数类型.class)//获得类方法管理对象
mothed.setAccessible(true) //确认获得私有
mothed.invoke(dog,"参数值");//调用方法
Dog类:
public class Dog {
private String name;
private int age;
public Dog() {
System.out.println("无参构造");
}
private Dog(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类:
public class Demo {
/*将一个map中的数据转存到一个实体类对象中。*/
@Test
public void test01() throws IllegalAccessException, NoSuchFieldException, InstantiationException {
/*利用map存放狗狗的信息*/
HashMap<String, Object> map = new HashMap<>();
map.put("name","旺财");
map.put("age",18);
/*调用创建对象方法*/
Dog dog = getObject(map, Dog.class);
System.out.println(dog);
}
/*反射创建对象*/
public <T>T getObject(Map<String,Object> map,Class<T> c) throws IllegalAccessException, InstantiationException, NoSuchFieldException {
/*无参构造器创建对象*/
T t = c.newInstance();
/*取出map中的狗狗信息*/
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries) {
String key = entry.getKey();
/*获得管理属性权*/
Field field = c.getDeclaredField(key);
/*获得私有权限*/
field.setAccessible(true);
/*设置属性*/
field.set(t,entry.getValue());
}
return t;
}
}