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