Java——反射
创建类的对象
反射的机制:动态的得到类的所有信息,调用所有的属性和方法(私有的属性和方法也可以调用)
反射的核心:类的镜子,类的字节码文件对应的类:Class类
每一个类,Class对象都是唯一的,类的Class对象,在这个类的字节码加载到内内存时,JVM就会为该类的字节码创建一个Class对象
反射的使用
- 得到某个类的Class对象
- 类名.class 得到该类的Class对象
- 类的对象.getClass()
- 通过Class类的static方法:forName(类的全限定名) 类的全限定名=包名+类名
- 通过Class对象获取某个类所有的属性、方法、构造方法
- 通过Class对象调用这个方法、构造方法
优点:能够调用类中的私有对象(私有属性,私有方法等)
反射中的方法
-
通过Class类的newInstance(),底层调用本类的无参构造方法
-
通过构造方法对象的Constructor类newInstance(Object…params)
-
getDeclaredConstructors() //获取构造方法 getDeclaredMethods() //获取方法 getDeclaredFields() //获取属性
注意事项:
- 如果调用的类中被private修饰的属性、方法、构造方法,调用setAccessible(true)
- 也可以通过getDeclaredMethods(方法名)来获取私有方法,但该方法不能获取继承的方法
- 方法名不用加括号,只用写方法名就行
反射的简单应用实例
写一个类ReflectUtil类, 类中写一个静态方法Object methodInvoker(String classMethd) 此classMethod为无参方法名如,
我们传入的实参字符串为:classMethod 为"java.lang.String.length()"就可以通过反射执行String类中的length方法、
当传入的实参字符串为"com.atguigu.javase.reflect.Teacher.test()"就可以执行指定包下,指定类中的指定方法
import dome.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class ReflectUtil {
public static Object methodInvoker(String classMethod) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
int dot = classMethod.lastIndexOf(".");//从后面开始找第一个出现的.
//获取全限定名
String name = classMethod.substring(0,dot);
//获取方法名
String methodName = classMethod.substring(dot+1,classMethod.length()-2);//减去输入时的(),从而获取方法名
//根据类名获取对象
Class cl = Class.forName(name);
Method method = null;
Class tmp = cl;
while (tmp!=null){
try {
method = tmp.getDeclaredMethod(methodName);
break;
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return method;
}
public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {
Method method1 = (Method) methodInvoker("java.lang.String.length()");
//System.out.println(method1);
System.out.println(method1.invoke("123456"));
Method method2 = (Method) methodInvoker("dome.Student.addStu()");
//System.out.println(method2);
Student stu = new Student();
System.out.println(method2.invoke(stu));
}
}