反射机制的含义及其功能
含义:
反射是被视为动态语言的关键,反射机制能够让程序在执行期间借助Reflection API获取任何类的内部信息,并能直接操作任意对象的内部属性和方法
功能:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用一个对象的成员变量和方法
生成动态代理
处理流程图
反射相关API
java.lang.Class : 代表一个类
java.lang.reflect.Method: 代表类的方法
java.lang.reflect.Field: 代表类的成员变量
java.lang.reflect.Constuctor: 代表类的构造方法
Class类
反射可以得到的信息: 某个类的属性,方法和构造器,某个类到底实现了哪些接口。
对于每个类而言,JRE都为其保留一个不变的Class对象,
一个Class对象包含了特定某个类的相关信息
Class本身也是一个类
Class对象只能由系统建立对象
一个类在JVM中只会有一个实例
一个Class对象对应的是一个加载到JVM中的一个。class文件(每个类在编译后会生成一个。class文件)
每个类的实例都会记得自己是由哪个Class实例生成的
通过Class可以完整得到一个类中的完整结构
获取class对象的方式
1.class.forName(“全类名”): 将字节码文件加载进内存,返回class对象
多用于配置文件,将类名定义在配置文件中。 读取文件,加载类
全类名: 包名。类名
会抛出ClassNotFoundException的异常
2.类名。class: 通过类名的属性class获取
多用于参数传递
3.对象。getClass(): getClass()方法在Object类中定义
多用于对象的获取字节码的方式
注意
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的class对象都是同一个
演示
package test;
public class main1 {
public static void main(String[] args) throws Exception {
//1.类全名
Class cls1= Class.forName("test.main1");
System.out.println(cls1);
//类名。class
Class cls2=main1.class;
System.out.println(cls2);
//对象。getClass()
main1 m=new main1();
Class cls3=m.getClass();
System.out.println(cls3);
//比较这三个对象
System.out.println(cls1==cls2);
System.out.println(cls1==cls3);
System.out.println(cls2==cls2);
}
}
获取一个类的父类和接口
package reflect;
public class main {
public static void main(String[] args) throws Exception {
Class cl1=Class.forName("reflect.stu");//获取指定类的Class实例
System.out.println(cl1.getName());
Class cl2=cl1.getSuperclass();//获取父类
System.out.println(cl2.getName());
//获取当前类的所有接口
Class[] interfaces=cl1.getInterfaces();
for(Class c:interfaces)
System.out.println(c.getName());
}
}
获取一个类的构造方法
//获取当前类的共有构造方法
Constructor[] con=cl1.getConstructors();
for(Constructor c:con)
{
//getModifiers(): 获取构造方法修饰符 返回1代表public 返回2代表private
//getName(): 获取方法名称
System.out.println("修饰符:"+c.getModifiers()+" 构造方法:"+c.getName());
//获取构造函数的参数,参数有几个数组里面元素就有几个
Class[] paramClass=c.getParameterTypes();
for(Class c1:paramClass)
{
System.out.println("构造方法: "+c.getName()+ " 参数类型: "+c1.getName());
}
}
System.out.println("--------------------------------------------------------");
//获取当前类的所有构造方法,包括共有和私有构造方法
Constructor[] con1=cl1.getDeclaredConstructors();
for(Constructor c:con1)
{
//getModifiers(): 获取构造方法修饰符 返回1代表public 返回2代表private
System.out.println("修饰符: "+c.getModifiers()+" 构造方法:"+c.getName());
Class[] paramClass=c.getParameterTypes();
for(Class c1:paramClass)
{
System.out.println("构造方法: "+c.getName()+ " 参数类型: "+c1.getName());
}
}
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64982.shtml