Class对象存储在类的字节码文件中,Class对象没有公共的构造方法
Class对象是在类加载时由java虚拟机或者类加载器的方法自动构造
不能显示的声明一个Class对象
getField getFields 与getMethod getMethods只能返回公共的属性
getDeclaredField getDeclaredFields 与getDeclaredMethod getDeclaredMethods 能获得该类(不包含超类)的属性方法,包括private
反射在获取私有方法时可直接通过getDeclaredMethod获取,除了invoke该方法时,调用方法的getName等一般方法时不需要通过
setAccessible(true)后取访问,而调用该方法时必须通过setAccessible(true)避开访问修饰的检查后,才能调用
私有属性的原理同上。
public class User {
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public User(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public User() {
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
@Override
public String toString() {
return "id="+this.id+",name="+this.name+",sex="+this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
private void so(){
System.out.println("私有的方法");
}
private String test(String s){
System.out.println(s);
return s;
}
}
测试代码:
package reflection;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class test {
public static void main(String[] args) throws Exception {
//方法的调用
Class aClass = Class.forName("reflection.User");
//User user = (User) aClass.newInstance(); //默认调用无参构造
//调用有参构造
User user= (User)aClass.getConstructor(int.class, String.class, String.class).newInstance(1, "张三", "男");
System.out.println(user);
Method setName = aClass.getDeclaredMethod("setName", String.class);
setName.invoke(user,"李四");
System.out.println(user);
//属性的调用
//能访问到该类所有的方法
Method[] declaredMethods = aClass.getDeclaredMethods();
for (Method method:declaredMethods){
System.out.println(method.getName()+"--"+method.getModifiers()+"--"+method.getReturnType());
}
//获取私有方法
Method so = aClass.getDeclaredMethod("so",new Class[]{});
System.out.println(so.getReturnType());
//调用私有方法
Method test = aClass.getDeclaredMethod("test",String.class);
test.setAccessible(true);
test.invoke(user,"测试私有方法");
//访问私有属性
Field name = aClass.getDeclaredField("name");
//更改反射访问的访问修饰检查
name.setAccessible(true);
name.set(user,"王五");
System.out.println(user);
//反射创建数组 Array类
//一维数组
Class<String> stringClass = String.class;
Object array = Array.newInstance(stringClass, 5);
Array.set(array,3,"三三三");
System.out.println(Array.get(array,3));
//二维数组 3*3
int[] dimens={3,3};
Object arrs = Array.newInstance(int.class, dimens);
Object arr = Array.get(arrs, 2);
Array.setInt(arr,1,10);
Array.setInt(arr,2,11);
int[][] ints = (int[][]) arrs;
System.out.println(ints[2][2]);
}
}
版权声明:本文为wanghaha1991514原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。