java反射
1、java中,无论生成某个类的多少个对象,这些对象都会对应同一个class对象。
2、想要使用反射,首先要获得待处理类或对象对应的Class对象。
3、获取某个类或某个对象所对应的Clsss对象的常用三种方式:
(1)使用Class类的静态方法:Class.forName("java.lang.String");
(2)使用.Class语法:String.class;
(3)使用对象的getClass方法:Class<?> clazz = String.getClass;
4、通过类的不带参数的构造方法来生成对象,有两种方式:
(1)先获得Class对象,然后通过该Class对象newInstance()方法直接生成即可。
Class classType = Customer.class; Object obj = classType.newInstance();
(2)先获得Class对象,然后通过该对象的对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成。(若想通过带参数构造方法生成对象,只能用该种方式)
//不带参数 Class classType = Customer.class; Constructor cons = classType.getConstructor(new Class[]{}) //获取空参数构造 Object obj = cons.newInstance(new Object[]{} ); //带参数 Class classType = Customer.class; Constructor cons = classType.getConstructor(new Class[]{int.class,int.class}) //获取空参数构造 Object obj = cons.newInstance(new Object[]{1,2} );
例子:使用反射机制调用对象的私有方法和私有属性
package reflect; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class PrivateTest { public static void main(String[] args) throws Exception { //通过反射访问私有属性 Person p = new Person(); Class<? > pClass = p.getClass(); Method method = pClass.getDeclaredMethod("say", new Class[]{String.class}); method.setAccessible(true);//压制java对访问修饰符的检查 String sayMethod = (String)method.invoke(p, new Object[]{"小莫"}); System.out.println(sayMethod); //通过反射访问私有成员变量 Field name = pClass.getDeclaredField("name"); name.setAccessible(true);//压制java对访问修饰符的检查 name.set(p,"小黄"); System.out.println(p.getName()); } }
package reflect;
public class Person {
private String name;
private String say(String name){
return "hello"+name;
}
public String getName() {
return name;
}
}

浙公网安备 33010602011771号