获取类结构
之前写过一个java反射的理解java反射的理解
获取类结构本质上就是获取类的java.lang.Class对象
拿Person类举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.mick.test;
public class Person { public String name; private int sex;
public Person(String name, Integer sex){ this.name = name; this.sex = sex; }
public Person() { }
public void speck(){ System.out.println(name + ":" + (sex>0? "男":"女")); }
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", sex=" + sex + '}'; } }
|
类属性操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Class<?> person = Class.forName("com.mick.test.Person");
Person test33 = (Person)person.getDeclaredConstructor(String.class, Integer.class).newInstance("test33", 1111);
Field[] declaredFields = person.getDeclaredFields();
for (Field field:declaredFields) { field.setAccessible(true); System.out.println(field.get(test33).toString()); }
Field sex = person.getDeclaredField("sex");
sex.setAccessible(true);
sex.setInt(test33, 3333333); System.out.println(test33);
|
类方法调用
1 2 3 4 5 6 7 8 9 10 11 12 13
| Class<?> person = Class.forName("com.mick.test.Person");
Person test33 = (Person)person.getDeclaredConstructor(String.class, Integer.class).newInstance("test33", 1111);
Method[] declaredMethods = person.getDeclaredMethods(); for (Method m:declaredMethods) { System.out.println(m.getName()); }
Method speck = person.getDeclaredMethod("speck"); speck.setAccessible(true); System.out.println(speck.invoke(test33));
|
反射常用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Class.getDeclaredAnnotations(); Class.getDeclaredAnnotation(null); Class.getDeclaredConstructors(); Class.getDeclaredConstructor(null); Class.getDeclaredFields(); Class.getDeclaredField("test"); Class.getDeclaredMethods(); Class.getDeclaredMethod(null); Field.setAccessible(); Method.setAccessible(); Method.invoke(); Field.setAccessible(); Field.set*() Field.get*()
|