目录
反射简介
反射就是可以通过一些方法得到一个类,进而得到这个类中的所有方法,属性。要想获得一个类,必须先要获取到该类的字节码文件对象。而获得类使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
class对象是class文件读入内存是jvm自动创建的。class对象中一般存方法名,属性名,方法属性地址等信息。
反射原理
-
首先将java文件保存在硬盘上
-
编译java文件,生成.class文件
-
将.class文件用类加载器加载到内存中
-
反射就是通过.class文件反向获得类的相关信息
-
成员变量,方法,构造方法等也被封装成类
-
成员变量通过类Field
使用反射
首先创建一个class文件保存
public class ReflectDemo {
//成员变量
public String name;
public int id;
//有参构造方法
public ReflectDemo(String name, int id) {
this.name = name;
this.id = id;
}
//无参构造方法
public ReflectDemo() {
}
//一般方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
再创建一个操作类
public class UseReflectDemo {
/*
* 获取class类对象的三种方法
* (1)类名.class
* (2)对象.getclass()
* (3)Class.forName(className) 参数:包名.类名
*
*
*调用构造方法
* Class类对象.getConstructor(parameterTypes) 参数:参数类型.class
Class类对象.getConstructors() 获得构造方法数组
*/
public static void main(String[] args) throws Exception {
Class c1 = ReflectDemo.class;
Class c2 = new ReflectDemo().getClass();
Class c3 = Class.forName("JdkTest.ReflectDemo");
//获得构造方法对象
Constructor gc = c3.getConstructor(String.class,int.class);
//获得ReflectDemo 对象,并创建有参对象
ReflectDemo rd2 = (ReflectDemo) gc.newInstance("abc",100);
System.out.println(rd2.getName()+" "+rd2.getId());
}
/*
* 获取类方法
* Class类对象.getDeclaredMethod(name, parameterTypes):获取一个方法
* Class类对象.getDeclaredMethods():返回一个参数数组
*
*/
@Test
public void test() throws ClassNotFoundException, Exception, Exception{
//获取class类对象
Class c4 = Class.forName("JdkTest.ReflectDemo");
//获取ReflectDemo对象
ReflectDemo rd4 = (ReflectDemo) c4.newInstance();
//获取方法对象
Method m4 = c4.getDeclaredMethod("getName",null);
Method m5 = c4.getDeclaredMethod("setName", String.class);
//m5.invoke(obj, args) 调用该方法 参数:(1)obj:方法对象(2)args:实参
m5.invoke(rd4, "String");
System.out.println(rd4.getName());
}
/*
* 获取类成员变量
* Class类对象.getDeclaredField(name) 获取一个变量对象
* Class类对象.getDeclaredFields 获取一个变量对象数组
*/
@Test
public void test1() throws Exception{
//获得class类对象
Class c5 = Class.forName("JdkTest.ReflectDemo");
//获得成员变量对象
Field f1 = c5.getDeclaredField("name");
//获得ReflectDemo 对象
ReflectDemo rd5 = (ReflectDemo) c5.newInstance();
//set方法设置成员变量值 参数:(1)obj:操作的对象 (2)value:值
f1.set(rd5,"ReflectDemo");
System.out.println(rd5.getName());
}
}