反射相关的主要API
java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器
反射的相关操作
获取Class实例的方式
Class clazz1 = Person.class;
System.out.println(clazz1);
Person p1 = new Person();
Class clazz2 = p1.getClass();
System.out.println(clazz2);
Class clazz3 = Class.forName("类的完整名称");
System.out.println(clazz3);
ClassLoader classLoader = ReflectionTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("类的完整名称");
System.out.println(clazz4);
获取对应类的对象
Class clazz = Person.class;
Object obj = clazz.newInstance();
获取类的结构
- 获取所有属性(包括父类的),但是只能获得public修饰的属性
Field[] fields = clazz.getFields(); - 获取所有自己所声明的属性,可以获得任何修饰符
Field[] f1 = clazz.getDeclaredFields(); - 获取所有方法(包括所有父类中的所有方法)但是只有public属性修饰的方法
Method[] methods = clazz.getMethods(); - 获取所有方法(获取自身所有说明的方法)不包含父类的
Method[] declaredMethods = clazz.getDeclaredMethods(); - 获取运行的当前实例中public的构造器
Constructor[] constructors = clazz.getConstructors(); - 获取当前运行实例中所有声明的构造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); - 获取运行时类的接口
Class[] interfaces = clazz.getInterfaces(); - 通过获得的属性、方法、构造器
通过getDeclaringClass()方法都可以获得当前类的字节码对象
getSimpleName()可以获得当前类的简单名称
Class clazz = Person.class;
Field[] fields = clazz.getFields();
Field[] f1 = clazz.getDeclaredFields();
int modifiers = f.getModifiers();
System.out.println(Modifier.toString(modifiers));
Class type = f.getType();
System.out.println("type = " + type.getName() + "\t");
String name = f.getName();
System.out.println("name = " + name);
Class clazz = Class.forName("com.qianfeng.entity.Student");
Method[] methods = clazz.getMethods();
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method m : declaredMethods) {
Annotation[] annotations = m.getAnnotations();
int modifiers = m.getModifiers();
System.out.println(Modifier.toString(modifiers));
String name = m.getReturnType().getName();
System.out.println("name = " + name);
String name1 = m.getName();
System.out.println("name1 = " + name1);
Class[] parameterTypes = m.getParameterTypes();
System.out.println(Arrays.toString(parameterTypes));
Class[] exceptionTypes = m.getExceptionTypes();
}
Class clazz = Class.forName("com.qianfeng.entity.Student");
Constructor[] constructors = clazz.getConstructors();
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
Class superclass = clazz.getSuperclass();
Type genericSuperclass = clazz.getGenericSuperclass();
Type[] actualTypeArguments = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments();
Class[] interfaces = clazz.getInterfaces();
Package aPackage = clazz.getPackage();
Annotation[] annotations = clazz.getAnnotations();
调用运行时类的指定的结构(属性方法构造器)
调用指定的属性
Class clazz = Class.forName("com.qianfeng.entity.Student");
Student s = (Student)clazz.newInstance();
Field s_id = clazz.getDeclaredField("s_id");
s_id.setAccessible(true);
s_id.set(s,"1001");
String o = (String) s_id.get(s);
System.out.println("o = " + o);
调用指定的方法
Class clazz = Class.forName("com.qianfeng.entity.Student");
Student s = (Student)clazz.newInstance();
Method setS_id = clazz.getDeclaredMethod("setS_id", String.class);
setS_id.setAccessible(true);
setS_id.invoke(s,"1001");
System.out.println(s);
名字.invoke(类名.class)或者.invoke(null)(其实填什么都无所谓,因为它都不会去识别);
调用指定的构造器
Class clazz = Class.forName("com.qianfeng.entity.Student");
Constructor declaredConstructor = clazz.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
Student s = (Student) declaredConstructor.newInstance();
通过反射动态的创建对象
package com.qianfeng.Test;
import java.util.Random;
public class Test02 {
public static void main(String[] args) {
int num = new Random().nextInt(3);
String classPath = "";
switch (num){
case 0:
classPath = "java.util.Date";
break;
case 1:
classPath = "java.lang.Object";
break;
case 2:
classPath = "com.qianfeng.entity.Student";
break;
}
Object obj = null;
try {
obj = instanceObject(classPath);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("obj = " + obj);
}
public static Object instanceObject(String classPath) throws Exception {
Class clazz = Class.forName(classPath);
return clazz.newInstance();
}
}
Class clazz = Person.class;
clazz.getConstructor(String.class,int.class)
Class: