JAVA学习之反射
扫描二维码
随时随地手机看文章
JAVA中所有类的祖先类都是object类,object类有一个很暴力的方法 getClass 例子,通过他得到子类的类名:getSimpleName
public class Test11A {
public void check(Obj j) {
System.out.println(j.getClass().getSimpleName());
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Test11A test11a = new Test11A();
Obj obj = new Sub1();
Obj obj2 = new Sub2();
test11a.check(obj);
test11a.check(obj2);
}
}输出: Sub1 Sub2
getName:
com.java.Obj.Sub1 com.java.Obj.Sub2
getDeclaredFields:获得成员变量数组
public class Sub1 extends Obj {
private int x;
private int y;
public String string;
public void Test()
{
System.out.println("Sub1 Test");
}public class Test11A {
public void check(Obj j) {
System.out.println(j.getClass().getClassLoader());
}
public void check2(Obj j) {
// 取得本类的全部属性
Class mclass =null;
mclass= j.getClass();
Field[] fields= mclass.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Class curClass=field.getType();
System.out.println(field.getModifiers()+","+curClass.getTypeName()+","+field.getName());
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Test11A test11a = new Test11A();
Obj obj = new Sub1();
Obj obj2 = new Sub2();
test11a.check2(obj);
test11a.check2(obj2);
}
}输出: 2,int,x 2,int,y 1,java.lang.String,string
访问修饰符是字符串,用java函数转换:
public void check2(Obj j) {
// 取得本类的全部属性
Class mclass =null;
mclass= j.getClass();
Field[] fields= mclass.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Class curClass=field.getType();
System.out.println(Modifier.toString((field.getModifiers()))+","+curClass.getTypeName()+","+field.getName());
}
}输出: private,int,x private,int,y public,java.lang.String,string
public void check2(Obj j) {
// 取得本类的全部属性
Class mclass = null;
mclass = j.getClass();
Field[] fields = mclass.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Class curClass = field.getType();
System.out.println(
Modifier.toString((field.getModifiers())) + "," + curClass.getTypeName() + "," + field.getName());
}
}public void check3(Obj j) {
// 取得本类的全部方法
Class mclass = null;
mclass = j.getClass();
Method[] marray = mclass.getDeclaredMethods();
for (int i = 0; i < marray.length; i++) {
Method field = marray[i];
java.lang.reflect.Parameter[] parameters= field.getParameters();
for (int k = 0; k < parameters.length; k++) {
java.lang.reflect.Parameter parameter = parameters[k];
System.out.println(parameter.getType().getName());
}
System.out.println(","+Modifier.toString(field.getModifiers()) + " " + field.getReturnType().getTypeName() + ":"
+ field.getName());
}
} public void check4(Obj j) {
// 根据字符串调用对象方法
Class mclass = null;
mclass = j.getClass();
try {
Method method = mclass.getDeclaredMethod("Test2",String.class,int.class);
method.invoke(j,"hi",555);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} void check5( ) throws InstantiationException, IllegalAccessException
{
//根据类名生成对象实例
try {
Class mClass = Class.forName("com.java.Obj.Sub1");
try{
Object obj =mClass.newInstance();
Method fucMethod= mClass.getMethod("Test2", String.class,int.class);
fucMethod.invoke(obj, "hello ",123);
}catch(Exception e){
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} 




