zoukankan      html  css  js  c++  java
  • 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();  
            }
        }
    })

  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5344439.html
Copyright © 2011-2022 走看看