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

代码如下:

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

@www.fanfengele.com

标签