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;
}
}
 

 

 
posted @ 2020-05-30 22:33  karinemo  阅读(104)  评论(0)    收藏  举报