Java Reflect

来源:互联网 发布:花溪区4g网络基站建设 编辑:程序博客网 时间:2024/05/16 02:13

 

1.      反射无参构造函数

Class clazz =Class.forName("com.test.reflect.Person"); 

Constructor c =clazz.getConstructor(null);

Person person = (Person)c.newInstance(null);

 

Class clazz = Class.forName("com.test.reflect.Person"); 

Person p = (Person)clazz.newInstance();

 

2.      反射带有参数的构造函数(简单类型)

Class clazz =Class.forName("com.test.reflect.Person"); 

Constructor c =clazz.getConstructor(String.class); 

Person p = (Person) c.newInstance("xxx");

 

例如:

public static UserHandle newUserHandle(intuserId) {

    UserHandle userHandle =null;

    try {

             Constructor<UserHandle>constructor = UserHandle.class.getConstructor(int.class);

             userHandle =(UserHandle) constructor.newInstance(userId);

    } catch (Exception e) {

             e.printStackTrace();

    }

   

    return userHandle;

}

 

3.      反射带有参数的构造函数(复杂类型)

Class clazz =Class.forName("com.test.reflect.Person"); 

Constructor c =clazz.getDeclaredConstructor(List.class); 

c.setAccessible(true); 

Person p = (Person) c.newInstance(new ArrayList()); 

 

4.      反射函数(非static函数)

public static voidgrantRuntimePermission(PackageManager pm,

                 StringpackageName, String permissionName, UserHandle user) {

        try{

                 Methodmethod = PackageManager.class.getMethod("grantRuntimePermission",

                         String.class,String.class, UserHandle.class);

                 method.invoke(pm,packageName, permissionName, user);

        }catch (Exception e) {

                 e.printStackTrace();

        }

}

 

5.      反射static函数

// AppOpsManager

public static int permissionToOpCode(Stringpermission) {

        try{

                 Methodmethod = AppOpsManager.class.getMethod("permissionToOpCode",

                         String.class);

                 return(Integer) method.invoke(null, permission);

        }catch (Exception e) {

                 e.printStackTrace();

        }

        return-1;

}

 

6.      反射成员变量

例如:反射ApplicationInfo下的int类型变量flagsEx(info为ApplicationInfo类型对象)

ApplicationInfo.class.getField("flagsEx").getInt(info)

 

package org.local;

public class ReflectTest {

        /**

         * @param args

         */

        privateint x;

        publicint y;

       

        publicString str1 = "abc";

        publicString str2 = "access";

       

        publicReflectTest(int x, int y) {

                 this.x= x;

                 this.y= y;

        }

        @Override

        publicString toString() {

                 return"ReflectTest [str1=" + str1 + ", str2=" + str2 +"]";

        }

       

}

 

ReflectTest test = new ReflectTest(3,5); 

//取得对象字节码 

Class cls = test.getClass();    

 

//getField只能得到可见的变量 

Field fd1 = cls.getField("y");//返回的值不是test对象的变量,而是Field对象。所以下面必须通过get方法传入指定的ReflectTest对象,获取值 

System.out.println("value1:" +fd1.get(test)); 

       

//getDeclaredField能够得到私有的变量 

Field fd2 = cls.getDeclaredField("x"); 

fd2.setAccessible(true);

 

 

参考:http://blog.csdn.net/howlaa/article/details/8606071

http://blog.sina.com.cn/s/blog_620b085d0100hcam.html

http://blog.csdn.net/a600423444/article/details/6448844

0 0
原创粉丝点击