反射机制定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Class类定义:
类是具有相同属性和行为的一类事物,类本身也可以进行抽象,因为类们也具有相同的属性和行为,比如都具有(属性,构造函数,方法,都能调用方法,)所以将类们又抽象成一个类Class。Class类继承object类。用于操纵类的属性,方法,构造器。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
3中方法获取类的类对象:
<1>根据全类名字符串得到类的方法和属性Class.forName(“类的全路径”)
Class<?> clas=Class.forName("java.lang.String");
<2>通过类的名字打点class,如Person.class
Class<Person> cals=Person.class;
<3>通过调用该类的对象.getClass()方法
下面是反射机制的实例:
Person类:
package com.rl.reflect;
public class Person {
private String name;
private String address;
private Integer age;
private String desc;
public Person(){
}
public Person(String name, String address, Integer age, String desc) {
super();
this.name = name;
this.address = address;
this.age = age;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + ", age=" + age + ", desc=" + desc + "]";
}
public static void test(){
System.out.println("this is a test");
}
}
测试类:
通过反射获取Person类中的构造器 并创建实例对象,再通过反射调用方法为对象赋值。
public class Test3 {
public static void main(String[] args) throws Exception{
Class<?> clas=Class.forName("com.rl.reflect.Person");
//根据无参构造器创建对象
Constructor<?> constructor=clas.getDeclaredConstructor(new Class[]{});
/* public T newInstance(Object ... initargs) 可变参数应该放数组*/
//反向调用方法
Method test=clas.getDeclaredMethod("test", new Class[]{});
Object object=constructor.newInstance(new Object[]{});
test.invoke(object, new Object[]{});
//调用setName() 并输出toString
Method setName=clas.getDeclaredMethod("setName", new Class[]{String.class});
Method toString=clas.getDeclaredMethod("toString", new Class[]{});
setName.invoke(object, new Object[]{"王五"});
//输出
System.out.println(object);
toString.invoke(object, new Object[]{});
System.out.println(object);
Constructor<Person> cons=(Constructor<Person>) clas.getDeclaredConstructor(new Class[]{String.class,String.class,Integer.class,String.class});
Person per=cons.newInstance(new Object[]{"张三","成都",20,"爱好打球"});
System.out.println(per);
}
}