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(); } }