• Java反射


          JAVA反射机制是在执行状态中,对于随意一个,都可以知道这个类的全部属性和方法。对于随意一个对象,都可以调用它的随意一个方法和属性;这样的动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    一、Class对象:
    class Person {
    	private static int age;
    	private String name;
    	//......
    
    	public Person() {
    	}
    
    	public Person(String name) {
    	}
    
    	public void eat() {
    	}
    
    	public static void staticMethod() {
    	}
    	
    	//......
    }

    二、获取Class对象:
    •Object obj=new Object();
    •1.Class cls=obj.getClass();//Class cls=obj.getSuperClass;
    •2.Class cls=Object.class;
    •3.Class cls=Class.forName("Object");
    •4.Class cls=Integer.TYPE; // Void.TYPE;

    三、获取类的其它属性:
    •**************获得类的名字********
    •String name=cls.getName();
    •*********获得类的修饰符***********
    •int m=cls.getModifiers();
    •String mStr=Modifier.toString(m);

    •********获得全部类成员的修饰符
    •Filed[] f=cls.getDeclaredFields();
    •String mStr=Modifer.toString(f[i].getModifiers());
    •*******获得public类成员************
    •Field f=cls.getFields();
    •f[i].getName();
    •Class type=f.getType();
    •String TypeStr=type.getName();
    •*******获得实现接口***************
    •Class[]ifs=cls.getInterfaces()

    •*********获得构造函数*************
    •Construct ct[] = cls.getDeclaredConstructors();
    •Class cls = ct[i].getDeclaringClass()
    •String ctName = ct[i].getName();
    •Class type[]=ct[i].getParameterTypes();

    •**********获得方法*************
    •Method[] m=cls.getDeclaredMethods();
    •m[i].getParameterTypes();
    •m[i].getExceptionTypes();

    四、Class对象的具体剖析(一):


    Class对象的具体剖析(二):

    一个实际样例:
    Android弹出对话框时。默认情况下不管点击哪个button,触发事件后对话框都会自己主动关闭。
    能够利用反射机制,使触发button点击事件之后不退出对话框。
    解决方法:在setButton的OnClickListener的OnClick里改变field,filed的改变对于该对象来说是全局的,所以想要关闭时也要加入代码。


    不退出对话框:
    .setPositiveButton("開始測试",  new  DialogInterface.OnClickListener(){
           @Override  
           public void onClick(DialogInterface dialog, int which) {                   
            try  {  
                   Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");  
                   field.setAccessible(true);  
                    //设置mShowing值,欺骗android系统   
                   field.set(dialog, false);  
               }catch(Exception e) {  
                   e.printStackTrace();  
               }
           }
       })
    点击退出对话框:
    .setNegativeButton("退出測试", new DialogInterface.OnClickListener() {  
        @Override  
        public void onClick(DialogInterface dialog, int which) {  
            try  
            {  
                Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");  
                field.setAccessible(true);  
                 //设置mShowing值,欺骗android系统   
                field.set(dialog, true);  
            } catch(Exception e) {  
                e.printStackTrace();  
            }
        }
    })

  • 相关阅读:
    协议与接口相关
    jmeter 使用(1)
    jmeter 压力测试
    shell脚本的规则
    charles的原理及使用
    Linux环境部署和项目构建
    面向对象
    python 基础练习题
    jmeter 使用(2)
    Ext.apply
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5344439.html
Copyright © 2020-2023  润新知