Java Reflection
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
Java反射机制提供的功能
Ø在运行时判断任意一个对象所属的类
Ø在运行时构造任意一个类的对象
Ø在运行时判断任意一个类所具有的成员变量和方法
Ø在运行时调用任意一个对象的成员变量和方法
Ø生成动态代理
l反射相关的主要API:
Øjava.lang.Class:代表一个类
Øjava.lang.reflect.Method:代表类的方法
Øjava.lang.reflect.Field:代表类的成员变量
Øjava.lang.reflect.Constructor:代表类的构造方法
Class类
在Object类中定义了以下的方法,此方法将被所有子类继承:
● public final Class getClass()
以上的方法返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。
u对照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class本身也是一个类
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
一个Class对象对应的是一个加载到JVM中的一个.class文件
每个类的实例都会记得自己是由哪个 Class 实例所生成
通过Class可以完整地得到一个类中的完整结构
实例化Class类对象(四种方法)
1)前提:若已知具体的类,通过类的class属性获取,该方法
最为安全可靠,程序性能最高
实例:Class clazz = String.class;
2)前提:已知某个类的实例,调用该实例的getClass()方法获
取Class对象
实例:Class clazz = “student”.getClass();
3)前提:已知一个类的全类名,且该类在类路径下,可通过
Class类的静态方法forName()获取,可能抛出ClassNotFoundException
实例:Class clazz = Class.forName(“java.lang.String”);
4)其他方式
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass(“类的全类名”);
@Test
public void Test() throws Exception {
//1.class
Class clazz=Student.class;
System.out.println(clazz.getName());
//2.getClass
Student student=new Student();
Class class1 = student.getClass();
System.out.println(class1.getName());
//3.classForName
Class forName = Class.forName("com.Student");
System.out.println(forName.getName());
//4.classLoad
ClassLoader classLoader = this.getClass().getClassLoader();
Class loadClass = classLoader.loadClass("com.Student");
System.out.println(loadClass.getName());
}
类的加载过程
当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。
//系统加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//扩展类加载器
ClassLoader parent = systemClassLoader.getParent();
System.out.println(parent);
//引导类加载器---c++编写无法获取
ClassLoader parent2 = parent.getParent();
System.out.println(parent2);
//查看类有哪个加载器加载
ClassLoader classLoader = Class.forName("com.ClassTest").getClass().getClassLoader();
System.out.println(classLoader);
//
ClassLoader classLoaders =
Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoaders);
//关于类加载器的一个主要方法:getResourceAsStream(String str):获取类路径下的指定文件的输入流
InputStream in = null;
in = this.getClass().getClassLoader().getResourceAsStream("com\\test.properties");
Properties pros = new Properties();
pros.load(in);
String name = pros.getProperty("user");
System.out.println(name);