一直以来感觉“java反射机制”是个很神秘,至少是我一时半会搞不懂的东西。。。
首先什么是java反射?
-
-
-
-
Class cla = Provider.class; -
-
Class cla_s = null; -
try { -
cla_s = Class.forName("com.pac.Provider");//静态方式获取 -
} catch (ClassNotFoundException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} -
-
System.out.println(cla.getPackage().getName());//获取Provider的包路径名称 -
System.out.println(cla.getSuperclass().getName());//获取Provider的父类名称 -
Class[] interfaces = cla.getInterfaces(); -
for(Object o:interfaces){ -
Class is =(Class)o; -
System.out.println(is.getName());//获取Provider的所有实现的接口的名称 -
} -
-
-
Field[] fid = cla.getDeclaredFields();//获取Provider自身定义的属性名称,不论 public 或private 或其它类型皆可获得 -
for(Object o:fid){ -
Field fd = (Field)o; -
System.out.println(fd.getName()); -
} -
-
Field[] fid_1 = cla.getFields();//获取Provider及父类定义的属性名称,只能获得public类型的属性 -
for(Object o:fid_1){ -
Field fd = (Field)o; -
System.out.println(fd.getName()); -
} -
-
Method[] med = cla.getDeclaredMethods();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 -
for(Object o:med){ -
Method fd = (Method)o; -
System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()"); -
} -
-
Method[] med_d = cla.getMethods();//得到Provider及其父类以及父类的父类(以此类推)的所有的public方法,当然子类重写父类的方法的情况下只显示一次。 -
for(Object o:med_d){ -
Method fd = (Method)o; -
System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()"); -
} -
-
Constructor[] con = cla.getDeclaredConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 -
for(Object o:con){ -
Constructor fd = (Constructor)o; -
TypeVariable[] tv = fd.getTypeParameters(); -
String para = ""; -
for(Object otv:tv){ -
TypeVariable v = (TypeVariable)otv; -
para += v.getName()+","; -
} -
para = para.length()==0?"":para.substring(0, para.length()-1); -
System.out.println("Constructor:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")"); -
} -
-
Constructor[] con_c = cla.getConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 -
for(Object o:con_c){ -
Constructor fd = (Constructor)o; -
TypeVariable[] tv = fd.getTypeParameters(); -
String para = ""; -
for(Object otv:tv){ -
TypeVariable v = (TypeVariable)otv; -
para += v.getName()+","; -
} -
para = para.length()==0?"":para.substring(0, para.length()-1); -
System.out.println("getConstructors:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")"); -
}
Class cla = Provider.class; Class cla_s = null; try { cla_s = Class.forName("com.pac.Provider");//静态方式获取 } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(cla.getPackage().getName());//获取Provider的包路径名称 System.out.println(cla.getSuperclass().getName());//获取Provider的父类名称 Class[] interfaces = cla.getInterfaces(); for(Object o:interfaces){ Class is =(Class)o; System.out.println(is.getName());//获取Provider的所有实现的接口的名称 } Field[] fid = cla.getDeclaredFields();//获取Provider自身定义的属性名称,不论 public 或private 或其它类型皆可获得 for(Object o:fid){ Field fd = (Field)o; System.out.println(fd.getName()); } Field[] fid_1 = cla.getFields();//获取Provider及父类定义的属性名称,只能获得public类型的属性 for(Object o:fid_1){ Field fd = (Field)o; System.out.println(fd.getName()); } Method[] med = cla.getDeclaredMethods();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 for(Object o:med){ Method fd = (Method)o; System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()"); } Method[] med_d = cla.getMethods();//得到Provider及其父类以及父类的父类(以此类推)的所有的public方法,当然子类重写父类的方法的情况下只显示一次。 for(Object o:med_d){ Method fd = (Method)o; System.out.println(Modifier.toString(fd.getModifiers())+" "+fd.getReturnType().getName()+" "+fd.getName()+"()"); } Constructor[] con = cla.getDeclaredConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 for(Object o:con){ Constructor fd = (Constructor)o; TypeVariable[] tv = fd.getTypeParameters(); String para = ""; for(Object otv:tv){ TypeVariable v = (TypeVariable)otv; para += v.getName()+","; } para = para.length()==0?"":para.substring(0, para.length()-1); System.out.println("Constructor:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")"); } Constructor[] con_c = cla.getConstructors();//获取Provider类自身定义的所有方法,不论 public 或private 或其它类型皆可获得 for(Object o:con_c){ Constructor fd = (Constructor)o; TypeVariable[] tv = fd.getTypeParameters(); String para = ""; for(Object otv:tv){ TypeVariable v = (TypeVariable)otv; para += v.getName()+","; } para = para.length()==0?"":para.substring(0, para.length()-1); System.out.println("getConstructors:"+Modifier.toString(fd.getModifiers())+" "+fd.getName()+"("+para+")"); }
- try
{ -
cla.newInstance();//实例化这个类 - }
catch (InstantiationException e) { -
e.printStackTrace(); - }
catch (IllegalAccessException e) { -
e.printStackTrace(); - }
try { cla.newInstance();//实例化这个类 } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
- try
{ -
Class[] ptypes = new Class[2]; -
ptypes[0] = Object.class; -
ptypes[1] = String.class; -
-
Method mm = cla.getDeclaredMethod("copy", ptypes); -
Provider pp = (Provider)cla.newInstance(); -
Object ags[] = new Object[2]; -
ags[0] = new Object(); -
ags[1] = new String("Hello,world"); -
mm.invoke(pp, ags); -
} catch (SecurityException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (NoSuchMethodException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (IllegalAccessException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (InstantiationException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (InvocationTargetExceptio n e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
}
try { Class[] ptypes = new Class[2]; ptypes[0] = Object.class; ptypes[1] = String.class; Method mm = cla.getDeclaredMethod("copy", ptypes); Provider pp = (Provider)cla.newInstance(); Object ags[] = new Object[2]; ags[0] = new Object(); ags[1] = new String("Hello,world"); mm.invoke(pp, ags); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetExceptio n e) { // TODO Auto-generated catch block e.printStackTrace(); }
- //运行时变更fields内容
-
try { -
Field code = cla.getDeclaredField("code"); -
Field name = cla.getDeclaredField("name"); -
-
Provider pp = (Provider)cla.newInstance(); -
name.set(pp, "nameaaa"); -
code.set(pp, "code1"); -
System.out.println("code:"+pp.getCode()); -
System.out.println("name:"+pp.getName()); -
-
} catch (SecurityException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (NoSuchFieldException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (IllegalArgumentException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (IllegalAccessException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} catch (InstantiationException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
}
//运行时变更fields内容 try { Field code = cla.getDeclaredField("code"); Field name = cla.getDeclaredField("name"); Provider pp = (Provider)cla.newInstance(); name.set(pp, "nameaaa"); code.set(pp, "code1"); System.out.println("code:"+pp.getCode()); System.out.println("name:"+pp.getName()); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); }