java.lang.reflec 运用及反射方法获取实例

87 阅读1分钟

代码如下:

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.HashMap;

public class ReflectTest {

public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { System.out.println("================获取构造方法============================="); Class lists = Class.forName("java.util.ArrayList"); Constructor[] ss = lists.getConstructors(); Class parameters[]; for (int i = 0;i< ss.length ;i++) { parameters = ss[i].getParameterTypes(); for (int j = 0; j < parameters.length; j++) { // 得到参数名 String s = parameters[j].getName(); s = s.substring(s.lastIndexOf(" . ") + 1, s.length()); System.out.print("第"+(i+1)+"个构造方法参数"+s + " "); } System.out.println(""); } System.out.println("===========获取私有变量并改变,比如字符串==================================");

String str = "hello world"; System.out.println(str); Class c = str.getClass(); Field field = c.getDeclaredField("value"); // 设置编译器检查通过 field.setAccessible(true); char[] chars = (char[]) field.get(str); chars[5] = '-'; System.out.println(str);

Field[] fields = c.getDeclaredFields(); for (Field f : fields) { // System.out.println(f.getName()); if (f.getType() == int.class) { System.out.println("公共的field是==" + f.getName()); } }

System.out.println("=================获取类的方法===========================");

        MyClass abc = new MyClass();
        Class cs = abc.getClass();
        System.out.println("Public Methods:");
        //得到所有类的方法
        Method methods[] = cs.getDeclaredMethods();
        for (int i = 0; i < methods.length; i++) {
            //得到方法的修饰符
            int modifiers = methods[i].getModifiers();
            if (Modifier.isPublic(modifiers)) {
                System.out.println(" " + methods[i].getName());
            }
        }
        
        
    System.out.println("=================调用类的方法===========================");
        MyClass2 myclass = new MyClass2();
        Class clazz = myclass.getClass();


        Class[] cc = new Class[2];
        cc[0] = String.class;
        cc[1] = HashMap.class;


        /*
         * getMethod(String,Class[] 返回一个 Method 对象,它反映此 Class
         * 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes
         * 参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。如果 parameterTypes 为
         * null,则按空数组处理。
         * 
         * 
         * getDeclaredMethod()  可返回自身类的指定方法名的的所有类型方法
         * getMethod() 可返回类中指定方法名的所有的公共方法,包括父类
         */
        Method m = clazz.getMethod("test", cc);

// Method m = clazz.getDeclaredMethod("print", cc); m.setAccessible(true);

        Object arglist[] = new Object[2];
        arglist[0] = new String("haha");
        HashMap<String,String> strs = new HashMap<String, String>();
        strs.put("tes", "test");
        arglist[1] = strs;
        /*
         * Object invoke(Object, Object[])
         * Object - 从中调用基础方法的对象 
         * Object[] - 用于方法调用的参数
         */
        m.invoke(myclass, arglist);
        
        

System.out.println("=================获取泛型类型===========================");

Type type = StringList.class.getGenericSuperclass(); System.out.println(type); ParameterizedType pt = (ParameterizedType) type; System.out.println(pt.getOwnerType()); System.out.println(pt.getActualTypeArguments()[0]); }

}

class StringList extends HashMap<Object, String> { }

class MyClass2 extends MyClassd { private void print(String str, HashMap<String, String> i) { System.out.println("inovke succeed:" + str + i.toString()); } }

class MyClassd { public void test(String str, HashMap<String, String> i) { System.out.println("inovke succeed:" + str + i.toString()); } }

class MyClass { public void a1() {} public void a2() {} protected void a3() {} private void a4() {} }

程序执行结果如下:

================获取构造方法=============================

第2个构造方法参数java.util.Collection
第3个构造方法参数int
===========获取私有变量并改变,比如字符串================================== hello world hello-world 公共的field是==offset 公共的field是==count 公共的field是==hash =================获取类的方法=========================== Public Methods: a1 a2 =================调用类的方法=========================== inovke succeed:haha{tes=test} =================获取泛型类型=========================== java.util.HashMap<java.lang.Object, java.lang.String> null class java.lang.Object