java 反射常用总结

1、获取类对象:

1) Animal animal = new Animal();

  Class c1 = animal.getClass();

  System.out.println("getClass:" + c1.getName());

2) Class c2 = Animal.class;

  System.out.println("class:" + c2);

3) Class c3 = Class.forName("reflect.Animal");

  System.out.println("forName:" + c3);

====================

构造方法:

//1.加载Class对象
Class clazz = Class.forName("fanshe.Student");

//2.获取所有公有构造方法
System.out.println("**********************所有公有构造方法*********************************");
Constructor[] conArray = clazz.getConstructors();
for(Constructor c : conArray){
System.out.println(c);
}

System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
conArray = clazz.getDeclaredConstructors();
for(Constructor c : conArray){
System.out.println(c);
}

System.out.println("*****************获取公有、无参的构造方法*******************************");
Constructor con = clazz.getConstructor(null);
//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
//2>、返回的是描述这个无参构造函数的类对象。

扫描二维码关注公众号,回复: 3508153 查看本文章

成员变量:

1.批量的:
Field[] getFields():获取所有的"公有字段" *
Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
2.获取单个的:
public Field getField(String fieldName):获取某个"公有的"字段
public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

成员方法:

1.批量的:
public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

2.获取单个的:
public Method getMethod(String name,Class<?>... parameterTypes):
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)


反射方法的其它使用之---通过反射越过泛型检查:
泛型用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的

ArrayList<String> strList = new ArrayList<String>();
Class listClass = strList.getClass();
Method m = listClass.getMethod("add", Object.class);
m.invoke(strList, 100);

----------------------------------------------------------------

eg:

  Class cc = Animal.class;
  // Class cc = Class.forName("reflect.Animal");
try {
   Object object = cc.newInstance();
  // 反射操作方法,方法名、参数类型
  Method hello = cc.getMethod("hello", String.class);
  hello.invoke(object, "csk");
  System.out.println("===============");
  // 反射操作属性,属性名称
  Field nameField = cc.getDeclaredField("name");
  // 暴力反射,解除私有限定
  nameField.setAccessible(true);
  nameField.set(object, "csk");
  System.out.println("name=" + nameField.get(object));

} catch (Exception e) {
  e.printStackTrace();
}

猜你喜欢

转载自www.cnblogs.com/csk-1/p/9764720.html