Java反射基础(转载)
反射概述
- 什么是Java的反射机制?
Java反射机制就是在运行过程中,对于任何一个类,都能知道这个类的属性和方法;
对于任意一个对象,都能调用它的任意属性和方法;
这种动态获取信息和动态调用对象方法的功能称为Java语言的反射机制。 - Java反射机制的作用
是编写通用性较高的代码或者框架的时候使用。
反射常用对象的概述
- Class
Class类的示例表示正在运行的Java应用程序中的类和接口 - Constructor
关于类的单个构造方法信息以及访问权限 - Field
Filed提供有关类或接口的单个字段的信息,以及对它的动态访问权限。 - Method
Method提供关于类或接口上单独某个方法的信息。
Class类
-
Java中java.lang.Class类用于表示一个类的字节码(.class)文件
-
如何得到某个class文件对应的Class对象?
已知类和对象的情况下:
类名.class
对象.getClass() Object类提供
未知类和对象的情况下:
Class.forName(“包名.类名”) -
Class表示某个类的字节码,并提供加载字节码的方法:forName(“包名.类名”)
forName方法用于加载字节码到内存中,并封装成一个Class对象。
package com.spring.reflection;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public void eat() {
System.out.println("吃、、、");
}
public void run() {
System.out.println("跑、、、");
}
}
package com.spring.reflection;
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException {
Class class1 = Person.class;
System.out.println(class1);
Person person = new Person();
Class class2 = person.getClass();
System.out.println(class2);
Class class3 = Class.forName("com.spring.reflection.Person");
System.out.println(class3);
}
}
PS:getClass()方式有点傻,都已经有对象直接用就可以了。
Constructor类
-
Constructor类的实例对象代表类的一个构造方法
-
得到某个类的所有构造方法
Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors(); -
得到指定的构造方法并调用
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(String.class);
String a = (String) constructor.newInstance(“abc”); -
Class类的newInstance()方法用来调用类的默认构造
String b = (String) Class.forName(“java.lang.String”).newInstance();
PS:getConstructor() 可以填写0~N个参数,0个参数代表获得无惨构造方法。
Field类
- Filed类代表某个类的一个成员变量,并提供动态的访问权限
- Filed对象获得所有的成员变量
//获取所有public属性(包含父类继承)
Field[] fields = Class.forName(“com.spring.reflection.Person”).getFields();
//取得所有声明的属性
Field[] declaredFields = Class.forName(“com.spring.reflection.Person”).getDeclaredFields();
- Filed对象获得指定成员变量
Field field = Class.forName(“com.spring.reflection.Person”).getField(“name”);
Field field = Class.forName(“com.spring.reflection.Person”).getDeclaredField(“name”);
- 设置Field变量是否可以访问
field.setAccessible(false);
- Field变量值的读取、获取
field.get(obj)
field.set(obj,“abc”);
Method类
- Method类代表某个类中的一个成员方法
- Method对象获取所有方法
Method[] declaredMethods = Class.forName(“com.spring.reflection.Person”).getDeclaredMethods();
Method[] declaredMethods = Class.forName(“com.spring.reflection.Person”).getMethods();
- Method对象获取指定方法
Method method = Class.forName(“com.spring.reflection.Person”).getDeclaredMethod(String name, Class<?>parameterTypes);
Class.forName(“com.spring.reflection.Person”).getMethod(String name, Class<?>parameterTypes);
- 通过反射执行方法
invoke.(obj,“abc”)
package com.spring.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class FieldTest {
public static void main(String[] args)
throws SecurityException, ClassNotFoundException, NoSuchFieldException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor<?> constructor = Class.forName("com.spring.reflection.Person").getConstructor(String.class);
Object person = constructor.newInstance("hah");
Method method = Class.forName("com.spring.reflection.Person").getMethod("eat");
method.invoke(person);
}
}
转自:https://blog.****.net/Dream_Weave/article/details/83824964