JAVA反射Field使用

更新1:

1.System.err: java.lang.InstantiationException: java.lang.Class<android.hardware.input.InputManager> has no zero argument constructor

  2.数组传参:Method method = clazz.getDeclaredMethod("setPointerPosition",new Class[]{float[].class});//数组传参

 try {
            InputManager inputManager = (InputManager) getSystemService(Context.INPUT_SERVICE);//先获取对象
           // Class clazz = Class.forName("android.hardware.input.InputManager");
            Class clazz = inputManager.getClass();//拿到class类
            Method[] methods = clazz.getDeclaredMethods();
//            for (Method method1:methods){
//                log.d("InputManager=====================" + method1);
//            }
            //无法通过newInstance构建对象,构造函数带参且私有
            /* private InputManager(IInputManager im) {
                mIm = im;
            }*/
            //Object object = clazz.newInstance();//System.err: java.lang.InstantiationException: java.lang.Class<android.hardware.input.InputManager> has no zero argument constructor
            Method method = clazz.getDeclaredMethod("setPointerPosition",new Class[]{float[].class});//数组传参
            log.d("InputManager==" + method);
            method.invoke(inputManager,new float[]{700,600});
        } catch (  NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

1.获取类的成员变量:

a)Class.getDeclaredField(String name);

     返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。

b)Class.getDeclaredFields();

     返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

c)Class.getField(String name);

     返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

d)Class.getFields();

         返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

     示例1:

public static int getPppoeType() {  
        int result = 14;  
        Class<ConnectivityManager> cls = ConnectivityManager.class;  
        Field[] fields = cls.getFields();  
        for (Field f : fields) {  
            if (f.getName().equals("TYPE_PPPOE")) {  
                try {  
                    result = f.getInt(cls);  
                } catch (IllegalArgumentException e) {  
                    e.printStackTrace();  
                } catch (IllegalAccessException e) {  
                    e.printStackTrace();  
                }  
                break;  
            }  
        }  
        return result;  
    }

2.获取类反射方法:a)首先通过反射获取类的类型:

	
// 第一种方式:通过Class静态方法forName(返回与带有给定字符串名的类或接口相关联的 Class 对象)
		try {
			Class ClasscType1 = Class.forName("com.sunniwell.UserInfo");//必须加上包名,否则报错
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
// 第二种方式:java中每个类型都有class属性
		Class ClasscType2 = UserInfo.class;

// 第三种方式:java语言中任何一个java对象都有getClass 方法
		UserInfo userInfo = new UserInfo();
		Class ClasscType3 = userInfo.getClass(); // ClasscType3是运行时类 

b)其次通过newInstance创建类对象新实例:此方法要求对应类必须有无参的构造方法,否则无法创建。

// 第二种方式:java中每个类型都有class属性
		Class ClasscType2 = UserInfo.class;
		try {
			Object object=ClasscType2.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

3.执行方射方法: 

 a)结构:方法.invoke(类实例,参数); b)method.setAccessible(true);作用打破封装,获取权限用;

Class<? extends Class> vClass = herosClass.getClass();
		try {
			Method method1 = herosClass.getMethod("setName", String.class);
			Method method2 = herosClass.getMethod("getName");
			Object userInfo = herosClass.newInstance();// 创建新实例
			method1.setAccessible(true);
			method1.invoke(userInfo, "hello");
			System.out.println("调用set方法:" + userInfo);
			System.out.println("调用get方法:" + method2.invoke(userInfo));
		} catch (Exception e) {
			e.printStackTrace();
		}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值