Field
Field提供有关类或接口的单个字段的信息和动态访问。 反射的字段可以是类(静态)字段或实例字段。
Field允许在获取或设置访问操作期间扩展转换,但如果发生缩小转换,则抛出IllegalArgumentException 。
他也是没有构造方法的
主要的方法
Object get(Object obj)
返回该所表示的字段的值 Field ,指定的对象上。
int getModifiers()
返回由该 Field对象表示的字段的Java语言修饰符,作为整数。//得到的修饰符在java内部被转换成整数,每个修饰符都由一个整数来表示
类<?> getType()
返回一个 类对象标识了此表示的字段的声明类型 Field对象。
void set(Object obj, Object value)
将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
void setAccessible(boolean flag)
将此对象的 accessible标志设置为指示的布尔值。 //他的作用是将类中私有的属性设置为可以操作的
代码演示
public class ClassTest {
public static void main(String[] args) {
Man man = new Man();
Class clazz1 = man.getClass();
Man man1 = null;
try {
man1 = (Man) clazz1.newInstance();
} catch (InstantiationException | IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//得到这个类的所有的属性
Field [] fields = clazz1.getDeclaredFields();
for (Field f : fields) {
System.out.println("属性的名字是:"+f.getName());
System.out.println("属性的修饰符是"+f.getModifiers());
f.setAccessible(true);
try {
f.set(man1, "哼哼"); //当属性是private修饰的时候,必须先调用setAccessible()方法
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(man1);
}
}
}
输出结果是
属性的名字是:name
属性的修饰符是2
哼哼
Method
方法提供有关类和接口上单一方法的信息和访问权限。 反映的方法可以是类方法或实例方法(包括抽象方法)。 方法允许在匹配实际参数以使用底层方法的形式参数进行IllegalArgumentException时发生扩展转换,但如果发生缩小转换,则会引发IllegalArgumentException 。没有构造方法
主要的方法
int getModifiers()
返回由该对象表示的可执行文件的Java语言modifiers 。
String getName()
返回由此 方法对象表示的方法的名称,作为 String 。
Type[] getGenericParameterTypes()
返回一个 Type对象的数组, Type以声明顺序表示由该对象表示的可执行文件的形式参数类型。
Type getGenericReturnType()
返回一个 Type对象,它表示由该表示的方法的正式返回类型 方法对象。
String getName()
返回由此 方法对象表示的方法的名称,作为 String 。
类<?>[] getParameterTypes()
返回一个 类对象的数组, 类以声明顺序表示由该对象表示的可执行文件的形式参数类型。
TypeVariable<方法>[] getTypeParameters()
返回一个 TypeVariable对象的数组,它们以声明顺序表示由此 GenericDeclaration对象表示的通用声明声明的类型变量。
Object invoke(Object obj, Object... args)
在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
void setAccessible(boolean flag)
将此对象的 accessible标志设置为指示的布尔值。 //他的作用是将类中私有的方法设置为可以操作的
代码演示主要的方法
public class ClassTest {
public static void main(String[] args) {
Man man = new Man();
Class clazz1 = man.getClass();
Man man1 = null;
try {
man1 = (Man) clazz1.newInstance();
} catch (InstantiationException | IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//得到所有的方法(本类中的方法)
Method[] methods =clazz1.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("方法的名字是:" + methods[i].getName());
//得到方法的修饰符
System.out.println("方法的修饰符是:"+methods[i].getModifiers());
//返回一个 Type对象的数组, Type以声明顺序表示由该对象表示的可执行文件的形式参数类型。
Type [] pyte = methods[i].getGenericParameterTypes();
for (int j = 0; j < pyte.length; j++) {
System.out.println(pyte[j].toString());
}
TypeVariable<Method>[] tv = methods[i].getTypeParameters();
for (int j = 0; j < tv.length; j++) {
System.out.println(tv[j].toString());
}
}
//调用类中的某个方法,invoke()方法中的第一个参数是类对象,第二个参数是执行这个方法的参数,是一个可变的参数类型
try {
Method m = clazz1.getMethod("setName",String.class);//只能获得公有 的方法(自己的方法+父类的方法)
m.invoke(man1, "哼哼的博客");
System.out.println(man1.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射之Class类的使用与理解 https://blog.csdn.net/weixin_43610698/article/details/92815696