1.1反射的核心API
1、基础类、平台类:java.lang.Class
(1)获得类的三种方法:
1、类名字.class => Class c = Student.class
2、对象.getClass()=> Class cls = stu.getClass()
3、Class.forName("java.lang.String")
(2)获得类的名字===> 类.getName()
Class cls = String.class.getName()
2、属性类:Field
3、方法类:Method
4、构造方法类:Constructor
1.2关于类的方法合集
注意:以下的所有的例子都以这个Student类为例
public class Student{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
1、stu.getName()//获取类的名字
2、stu.newInstance()//就是new对象实例,相当于new+无参构造方法==》
Student stu = cls.newInstance()
3、获得属性(一个和一堆)
(1)stu.getField(String)
(2)stu.getDeclaredField(String)
(3)stu.getFields():获得本类和父类的所有公共属性
(4)stu.getDeclaredFields():获得本类的所有属性
注意:获得属性也可以拿取属性的修饰符、类型和名字
例:
Class cls = Student.class;
Fields[] fs = cls.getDeclaredFields();
for(Field f:fs){
//属性的名字
String fname = f.getName();
//属性的类型
Class fType = f.getType();
String fTypeName = fType.getName();
//修饰符(获得的属性为int,需要转一下)
int m = f.getModifiers();
String mod = Modifier.toString(m);
}
4、获得方法(和属性的获得大同小异)
(1)stu.getMethod(1,2)//1:方法名 2:class类的可变参数
(2)getDeclaredMethod(1,2)//1:方法名 2:class类的可变参数
例如:=》Method m = cls.getDeclaresMethod("setUsername",String.class)
//破封装,当方法是私有的时需要破封装,下面的方法执行才会起作用
m.setAccessible(true);
//方法的执行,相当于stu.setUsername("etoak");
m.invoke(stu,"etoak");
(3)getMethods()
(4)getDeclaredMethods()
注意:因为属性没有参数,但是方法有参数,这是唯一的不同点
例:
Class cls = String.class;
Methods[] mt = cls.getDeclareMethods();
for(Method m:mt){
//获得方法的名字
String mName = m.getName();
//获得方法的修饰符
String mModifier = Mo difier.toString(m.getModifier());
//获得方法的返回类型
String mTypeName = m.getType().getName();
//获得方法的参数(这里是不一样的地方)
Class[] params = m.getParameterTypes();
for(Class p:params){
//getSimpleName()是获取简写的名字
String pName = p.getSimpleName();
}
}