Java反射笔记
1:Class类
同Object,String等类一样,Class也是一个类
- 构造函数只可由JVM调用,不可由开发者调用。
- 任何一个类均是Class类的实例对象。
- 任何继承Object的对象均有 getClass()方法,返回该对象,Class类的对像有class静态成员。
package reflect;
public class Main {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Class foo = Foo.class;
Foo fooInstance = (Foo) foo.newInstance();
Foo fooInstance1 = (Foo) foo.newInstance();
Class clazz = fooInstance.getClass();
System.out.println(clazz);
//打印 class reflect.Foo
clazz = fooInstance.getClass().getClass();
System.out.println(clazz);
//打印 class java.lang.Class
}
}
2.动态加载类
编译期间加载的类称为静态加载,运行期间加载的类称为动态加载类。
Foo foo = new Foo();//静态加载
Foo foo = (Foo)Class.forName("Foo").newInstance();//动态加载
Q
为什么使用动态加载类?
A
运行时能可以根据需求来选择加载哪些类。
2.反射调用方法
通过反射机制调用类的某个方法称为反射调用。
例如:
反射类:
package com.tiddar;
public class RoyalWhite {
public void kaigua() {
System.out.println("我卢本伟没有开挂!");
}
}
调用类:
package com.tiddar;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class LuBenWei {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException, ClassNotFoundException {
//获取类
Class clazz = Class.forName("com.tiddar.RoyalWhite");
//获取类的一个方法,传入方法名,若方法有重载也可在方法名之后传入参数类型
Method kaiguaMethod = clazz.getDeclaredMethod("kaigua");
//实例化上面获取的类然后反射调用方法,
kaiguaMethod.invoke(clazz.newInstance());
}
}
运行结果: