获取某一个类中的构造方法、属性、普通方法都必须先建立Class对象,再调用方法来获取构造方法、属性、普通方法。
1.属性:
①如何获取属性
(1)Field field = clazz.getField(“name”); 可以获取public级别的,包括继承的父类的public级别的
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Field field = clazz.getField("name"); //name是属性的名字,加引号
System.out.println(field.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
(2)Field field1 = clazz.getDeclaredField(“name”); 只能获取本类中的属性,没有权限限制,即使是private也可以获取到。
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Field field1 = clazz.getDeclaredField("name"); //name是属性的名字,加引号
System.out.println(field.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
②通过Field类某些方法可以获取某个成员变量的信息,这些方法如下:
(1)返回Class<?> 对象的实例
getDeclaringClass():返回声明Field对象 表示字段的所在的 类或接口所对应的Class对象。
(2)返回int 类型
getModifiers():以整数形式返回Field对象表示的字段的修饰符。public static等
(3)返回Class<?> 对象的实例
getType():返回Field对象所表示字段的数据类型 所对应的Class对象(推荐)。
(4)返回Type 类型
getGenericType():返回此Field对象所表示字段的声明类型。
(5)返回String类型
getName():返回Field对象表示字段的“名称”。
在Student类创建俩个新的变量
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Field field = clazz.getField("name");
System.out.println(field.getName());
Class cla = field.getDeclaringClass();
System.out.println(cla);
System.out.println(Modifier.toString(field.getModifiers()));
Class claz = field.getType();
System.out.println(claz.getName());
Field field1 = clazz.getField("name1");
System.out.println(field1.getGenericType());
Field field2 = clazz.getField("name2");
System.out.println(field2.getGenericType());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行的结果
③操作属性(赋值和获取属性的值)
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Field field = clazz.getField("name"); //在此代码中,可以理解为field代表name
System.out.println(field.getName());
field.setAccessible(true); //忽略权限,如果name是private也可以在别的类中使用
Student student = new Student(); //新建一个Student类型对象
field.set(student, "jim"); //为student 对象的 name赋值jim
Object object = field.get(student); //获取student对象的name值
System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果
2.普通方法
①如何获取普通方法
(1)clazz.getMethods(); 返回一个Method [] 数组;
只能是Student类中的public普通方法,还包括继承自父类的public方法
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Method [] methods = clazz.getMethods(); //返回一个数组
for( Method method : methods) {
System.out.println(method.getName());
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
运行结果
(2).getDeclaredMethods();得到的只是“本类”中的普通方法,不包括父类,可以是私有的
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Method [] methodz = clazz.getDeclaredMethods();
for( Method method : methodz) {
System.out.println(method.getName());
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
②通过Method类某些方法可以获取某个普通方法的信息,这些方法如下:
(1)返回Class<?>类型
getDeclaringClass():返回声明Method对象表示方法的类或接口的 Class 对象。
(2)返回int类型
getModifiers():以整数形式返回此Method对象所表示方法的修饰符。应该使用Modifier类中的toString方法对所返回的整数进行解码。
(3)返回Class<?> 类型
getReturnType():返回Method对象所表示的方法的返回值类型所对应的Class对象。
(4)返回String 类型
getName():返回方法名。
(5)返回Class<?>[ ] 数组
getParameterTypes():返回由Method对象代表方法的形参类型对应Class对象组成的数组。如果方法没有参数,则数组长度为 0。
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Method method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
//获取特定某一个方法,先写方法名注意冒号,再写传入方法的参数的类型的Class类
System.out.println(method.getName());
System.out.println(method.getDeclaringClass());
System.out.println(Modifier.toString(method.getModifiers()));
clazz = method.getReturnType();
System.out.println(clazz.getName());
Class [] clazzs = method.getParameterTypes();
for(Class zz : clazzs) {
System.out.println(zz.getName());
}
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
③如何使用普通方法
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) {
Class clazz =null;
clazz = Student.class;
try {
Method method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
method.setAccessible(true);
Object object = method.invoke(new Student(), 1,"tom");
System.out.println(object);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
运行结果
Student类
public class Student {
public String name;
public Integer name1;
public int name2;
public Student() {
}
public Student(String name) {
this.name =name;
}
private int doHomework(int a , String aa) {
System.out.println("正在写作业。。。");
return 1;
}
}