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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值