Class获取
-
Object.getClass()
Student s = new Student();
Class clazz = s.getClass();
- .class标识
Class clazz = Student.class;
- Class.forName()
try {
Class clazz = Class.forName("包名+.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
getName()、getSimpleName()和getCanonicalName()
https://blog.youkuaiyun.com/qq_40667603/article/details/105551541
Class 获取修饰符
通过Class.getModifiers()获取到一个int值,然后用Modifier类去解析
Class clazz = Class.forName("com.zrsoft.green.Student");
System.out.println(Modifier.toString(clz1.getModifiers()));
System.out.println(Modifier.isPublic(clazz.getModifiers()));
System.out.println(Modifier.isPrivate(clazz.getModifiers()));
返回
获取Class成员
获取Filed
- getDeclaredFields() : 可以获取到被private修饰的属性,不会获取祖先类属性
- getFields() : 不能获取被private修饰的属性,会获取祖先类属性
- getDeclaredField(String name) : 获取指定名字属性 可以获取到被private修饰的属性,不会获取祖先类属性
- getField(String name) : 获取指定名字属性 不能获取被private修饰的属性,会获取祖先类属性
示例
public class Person {
public String high;
private String weight;
}
public class Student extends Person{
private String name;
public String age;
}
Class clazz = Class.forName("com.zrsoft.green.Student");
Field[] field1s = clazz.getDeclaredFields();
for (Field field1 : field1s) {
System.out.println(field1.getName());
}
System.out.println("--------------");
Field[] field2s = clazz.getFields();
for (Field field2 : field2s) {
System.out.println(field2.getName());
}
输出
获取Method
- getDeclaredMethod(String name, Class<?>... parameterTypes)
- getMethod(String name, Class<?>... parameterTypes)
- getDeclaredMethods() throws SecurityException
- getMethods()
parameterType是方法的参数,和获取属性方法类似,有参数时必须传入参数的Class
public void studyPulic(String name) {
}
Method m = clazz.getMethod("studyPulic",String.class);
获取 Constructor
- getDeclaredConstructor(Class<?>... parameterTypes)
- getConstructor(Class<?>... parameterTypes) Constructor 不能从父类继承,没有办法通过 getConstructor() 获取到父类的 Constructor
- getDeclaredConstructors()
- getConstructors() Constructor 不能从父类继承没有办法通过 getConstructor() 获取到父类的 Constructor
Field 处理
Field 获取属性名
- getName()方法
Field 类型的获取
- getGenericType() 能获取到泛型类型
- getType()
- getComponentType() 如果属性是数组,可通过此方法获取数组中参数类型
Field 修饰符的获取
- getModifiers() 和获取Class的修饰符一样
Field 值的读取和赋值
- 读取 : Field中一系列的get方法,如get(Object obj) 、getInt(Object object)、getBoolean(Object object)等
- 赋值 : Field中一系列的set方法,如set(Object obj,,Object value) 、setInt(Object object,int value)、setBoolean(Object object,boolean value)等
Object 代表想要获取或者赋值的对象,注意属性被private修饰时需要在进行操作前调用Field对象的setAccessible(true),打开操作权限
Method 处理
Method 获取方法名
- getName()方法
Method 获取修饰符
- getModifiers() 获取参数的修饰符 同上Class处理
Method 获取方法参数相关
- getParameters() 返回的是一个Parameter数组
- getParameterTypes() 获取所有的参数类型 返回Class数组
- getGenericParameterTypes() 获取所有的参数类型,包括泛型 返回Type数组
Parameter中的方法(获取方法参数相关)
- getName() 获取参数名字 如果jdk是1.8以下或者没有设置带参数名编译,那么Parameter的getName函数只会返回arg0,arg1,arg2......
- getType() 获取参数类型
- getModifiers() 获取参数的修饰符 同上Class处理
Method 获取方法返回值类型
- getReturnType() 返回Class数组
- getGenericReturnType() 包括泛型 返回Type数组
Method 获取异常类型
- getExceptionTypes() 类比上方
- getGenericExceptionTypes() 类比上方
Method 方法的执行
- invoke(Object obj, Object... args) 返回Object对象,有返回值时需要强转
注意 : 第一个Object代表具体某个对象,和Filed赋值和取值传入的类似,静态方法传null,剩下的Object对应方法参数。方法抛出异常时可在InvocationTargetException 中获取。在执行private修饰的方法时需先调用Method对象的setAccessible(true)方法打开操权限,
示例
public void test(String name) throws IllegalAccessException {
throw new IllegalAccessException("抛出异常" + name);
}
try {
Student student = new Student();
Class clazz = student.getClass();
Method m = clazz.getMethod("test", String.class);
System.out.println("方法名称:" + m.getName());
Type[] p = m.getGenericParameterTypes();
System.out.println("参数数量:" + p.length);
for (Type parameter : p) {
System.out.println("参数名称:" + parameter.getTypeName());
}
m.invoke(student,"李三");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
System.out.println("方法传出异常:" + e.getCause().getMessage());
}
打印
Constructor 处理
在 Java 反射机制中有两种方法可以用来创建类的对象实例:Class.newInstance() 和 Constructor.newInstance()。官方文档建议开发者使用后面这种方法,下面是原因。
- Class.newInstance() 只能调用无参的构造方法,而 Constructor.newInstance() 则可以调用任意的构造方法。
- Class.newInstance() 通过构造方法直接抛出异常,而 Constructor.newInstance() 会把抛出来的异常包装到 InvocationTargetException 里面去,这个和 Method 行为一致。
- Class.newInstance() 要求构造方法能够被访问,而 Constructor.newInstance() 却能够访问 private 修饰的构造器。访问时需要调用Constructor对象的setAccessible(true)打开权限