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

  • 相关阅读:
    脚本,网络配置,指令
    拦截TextBox 双击消息
    VB指针操作和消息钩子
    文件和文件夹操作
    常见反编译产生错误 k__BackingField 解决办法
    关机/重启/注销
    通用命名前缀
    语言区域代码
    常用数据库链接字符串
    用VB实现COM+组件配置
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5344439.html
Copyright © 2011-2022 走看看