反射的使用

        反射机制可以创建对象,随时的实例化对象。

一、调用类对象的两种方法

//        通过类对象来创建。
        Class cls=Class.forName("reflect.ReflectDemo1");
        
        System.out.println(cls.getName());//      reflect.ReflectDemo1
        System.out.println(ReflectDemo1.class.getName());//   reflect.ReflectDemo1


        Class cls==类名.class

二、利用类对象来创建实例化对象

package reflect;
public class ReflectDemo2 {
    public ReflectDemo2() {
        System.out.println("干饭");
        System.out.println("干中午饭");
        System.out.println("干早饭");
    }

    public static void main(String[] args) throws InstantiationException, 
    IllegalAccessException, ClassNotFoundException {
//        通过类对象来创建。
        Class cls=Class.forName("reflect.ReflectDemo2");
        Object o = cls.newInstance();//等同于
        ReflectDemo2 reflectDemo2 = new ReflectDemo2();
        System.out.println(reflectDemo2);//干饭干中午饭干早饭
        System.out.println(o);//干饭干中午饭干早饭
    }
}

三、通过键盘输入来获取类对象

        System.out.println("输入类值");
        Scanner scanner = new Scanner(System.in);
        String classname = scanner.nextLine(); 
        //通过键盘输入来创建类对象
        Class cls = Class.forName(classname);
        //获取该类下所有方法名
        Method[] method1 = cls.getMethods();
        System.out.println("method 方法有: ");
        for (Method method : method1) {
            System.out.print(method.getName()+" 、");
        }
        
        System.out.println("输入方法的值");
        //只有实例化对象才能调用其方法
        Object o = cls.newInstance();
        String s = scanner.nextLine();

        Method method = cls.getMethod(s);
        //用此方法调用对象
        method.invoke(o);

         Object o = cls.newInstance(); 实例化类,只有实例化才能调用方法

         Method method = cls.getMethod("playGame"); 这里放着要调用的方法

         method.invoke(o); 调用方法。

四、调用有参方法(需传值)

        Object o = cls.newInstance();

        Method method0 = cls.getMethod("say");//调用无参方法         

        Method method = cls.getMethod("say", String.class,int.class);//调用有参方法         method0.invoke(o);

        method.invoke(o,"jib",5);

五、获取私有方法,和在外部调用私有方法

        Class cls = Class.forName("reflect.Person");
        Object o = cls.newInstance();
        
//      1.正常获取类的私有方法是获取不了的 
        Method method = cls.getMethod("haha");
        method.invoke(o);//会报错NoSuchMethodException
        

//      2.通过获取所有方法包括私有方法
        Method method2 = cls.getDeclaredMethod("haha");
//      2.1再打开私有方法权限
        method2.setAccessible(true);
        method2.invoke(o);//我是haha的私有方法

         getDeclaredMethod()会获取所有的方法

         setAccessible(true) 强行打开访问权限,通过反射获取私有方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值