JAVA反射机制及应用例子
来源:互联网 发布:webex recorder mac 编辑:程序博客网 时间:2024/05/16 19:12
JAVA 反射机制是Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程式在运行时通过Reflection APIs 取得任何一个已知名称的class 的内部资讯,包括其modifiers(诸如public, private,static 等等)、superclass(例如Object)、interfaces(例如Cloneable),也包括fields 和methods 的所有资讯, 并在运行时调用任意一个对象的方法;生成动态代理。下面以一段代码来看一下主要的Reflection APIs,代码中有相应的注释。
Java代码
- import java.lang.reflect.Array;
- 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;
- public class Goods
- {
- private String id;
- private double price;
- public Goods(){
- System.out.println("it is a pen");
- }
- public Goods(String s1,String s2){
- System.out.println(s1+"*"+s2);
- }
- public String getId()
- {
- System.out.println(id);
- return id;
- }
- public void setId(String id)
- {
- this.id = id;
- }
- public String addName(String str1,String str2){
- return str1+str2;
- }
- /**
- * @throws ClassNotFoundException
- * @throws IllegalAccessException
- * @throws InstantiationException
- * @throws NoSuchMethodException
- * @throws SecurityException
- * @throws InvocationTargetException
- * @throws IllegalArgumentException
- * @throws NoSuchFieldException
- * @功能描述
- * @输入参数
- * @反馈值
- */
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
- {
- // TODO Auto-generated method stub
- String str = "com.xtlh.sinye.Goods";
- Class c = Class.forName(str);
- Object obj = c.newInstance();//初始化一个Goods的对象
- /**
- * //这里设置属性的值 调用setId()方法,类型用Class[],参数用Object[]
- */
- Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")});
- m.invoke(obj,new Object[]{"it's apple"});
- System.out.println("---------------------------------------------------------------------");
- /**
- * //这里是里获取属性的值 调用getId()方法
- */
- m = c.getMethod("getId",new Class[]{});
- m.invoke(obj,new Object []{});
- System.out.println("---------------------------------------------------------------------");
- /**
- * //获得类中声明的方法
- */
- Method me[] = c.getDeclaredMethods();
- for(int i=0;i<me.length;i++){
- System.out.println("method["+i+"]="+me[i].toString());
- }
- System.out.println("---------------------------------------------------------------------");
- /**
- * //模拟 instanceof 操作符
- */
- boolean b1 = c.isInstance(new Integer(34));
- System.out.println("Goods is a instance of Integer ? "+b1);
- boolean b2 = c.isInstance(new Goods());//这里调用了无参的构造方法
- System.out.println("Goods is a instance of Goods ? "+b2);
- System.out.println("---------------------------------------------------------------------");
- /**
- * //找出类的方法,类的名称,类的方法的参数,类的方法的返回类型
- */
- Method med[] = c.getDeclaredMethods();
- Method med1[] = c.getMethods();//从字面意思可以看出来,这里找到所有的方法,即可以找到继承来的方法等
- for(int i=0;i<med.length;i++){
- Method mee = med[i];
- System.out.println("method # "+i+" name="+mee.getName());
- System.out.println("declaring class ="+mee.getDeclaringClass());
- //方法的参数类型
- Class pvec[] = m.getParameterTypes();
- for(int j=0;j<pvec.length;j++){
- System.out.println("parameter # "+j+" ="+pvec[j]);
- }
- //方法的异常
- Class evec[] = m.getExceptionTypes();
- for (int j = 0; j < evec.length; j++){
- System.out.println("exception #" + j + " " + evec[j]);
- }
- //方法的返回类型
- System.out.println("return type = " + mee.getReturnType());
- }
- System.out.println("---------------------------------------------------------------------");
- /**
- * //获取类的构造函数
- */
- Constructor ctorlist[] = c.getDeclaredConstructors();
- for(int i=0;i<ctorlist.length;i++){
- Constructor cons = ctorlist[i];
- System.out.println("Constructor #"+i+" name="+cons.getName());
- Class[] consParaType = cons.getParameterTypes();//获得构造函数的参数类型
- if(consParaType.length==0){
- System.out.println("Constructor have no parameters");
- }else{
- for(int j=0;j<consParaType.length;j++){
- System.out.println("Constructor Parameter type #"+j+" name="+consParaType[j]);
- }
- }
- }
- System.out.println("---------------------------------------------------------------------");
- /**
- * //获取类的属性
- */
- Field fieldlist[] = c.getDeclaredFields();
- for(int i=0;i<fieldlist.length;i++){
- Field field = fieldlist[i];
- System.out.println("Filed #"+i+" name="+field.getName());//属性名称
- System.out.println("Filed #"+i+" type="+field.getType());//属性类型
- int mod = field.getModifiers();
- System.out.println("modifiers = " + Modifier.toString(mod));//属性的修饰符 private/public/protected
- }
- System.out.println("---------------------------------------------------------------------");
- /**
- * //根据方法的名称来执行方法
- */
- Class cls = Class.forName("com.xtlh.sinye.Goods");
- Class partypes[] = new Class[2];
- partypes[0] = String.class;//更多类型 Long.TYPE Integer.TYPE,或者使用Long.class、Integer.class
- partypes[1] = Class.forName("java.lang.String");
- Method meth = cls.getMethod("addName", partypes);
- Goods goods = new Goods();
- Object arglist[] = new Object[2];
- arglist[0] = new String("love");
- arglist[1] = new String("grape");
- Object retobj = meth.invoke(goods, arglist);
- String retval = (String) retobj;
- System.out.println(retval);
- System.out.println("---------------------------------------------------------------------");
- /**
- * 创建对象,根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值
- */
- Class clss = Class.forName("com.xtlh.sinye.Goods");
- Class partypess[] = new Class[2];
- partypess[0] = String.class;
- partypess[1] = String.class;
- Constructor ct = clss.getConstructor(partypess);
- Object arglists[] = new Object[2];
- arglists[0] = new String("hello");
- arglists[1] = new String("orange");
- Object retobjs = ct.newInstance(arglists);
- System.out.println("---------------------------------------------------------------------");
- /**
- * //改变属性的值
- */
- Class ccc = Class.forName("com.xtlh.sinye.Goods");
- Field fld = ccc.getDeclaredField("price");
- Goods goods1 = new Goods();
- System.out.println("price = " + goods1.price);
- fld.setDouble(goods1, 25.0);
- System.out.println("price = " + goods1.price);
- System.out.println("---------------------------------------------------------------------");
- /**
- * //简单使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋了值,最后将这个字符串从数组中取得并打印了出来
- */
- Class cla = Class.forName("java.lang.String");
- Object arr = Array.newInstance(cla, 10);
- Array.set(arr, 5, "hello Watermelon");
- String s = (String) Array.get(arr, 5);
- System.out.println(s);
- System.out.println("---------------------------------------------------------------------");
- /**
- * //复杂数组使用,例中创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
- 注意创建数组时的类型是动态的,在编译时并不知道其类型。
- */
- int dims[] = new int[]{5, 10, 15};
- Object array = Array.newInstance(Integer.TYPE, dims);
- Object arrobj = Array.get(array, 3);
- Class cl = arrobj.getClass().getComponentType();
- System.out.println(cl);
- arrobj = Array.get(arrobj, 5);
- Array.setInt(arrobj, 10, 37);
- int arrcast[][][] = (int[][][]) array;
- System.out.println(arrcast[3][5][10]);
- }
- }
- JAVA反射机制及应用例子
- JAVA反射机制及应用例子
- java反射机制应用例子
- Java反射机制及应用
- java反射机制例子
- Java反射机制及应用(一)
- java反射机制详解及应用
- java反射机制及应用分析
- Java 反射机制 及 应用场景
- java的反射机制及应用
- Java反射机制应用
- 一个Java反射机制例子
- java反射机制简单例子
- 一个Java反射机制例子
- java反射机制简单例子
- Java反射机制的例子
- Java反射机制小例子
- java反射机制的例子
- exit(0)与exit(1)、return区别
- ubuntu JDK install
- 重装.net Framework
- Linux下tar.xz 文件 解压
- 公钥和私钥
- JAVA反射机制及应用例子
- BSD Sockets API
- linux启动引导程序配置文件
- Android 图像处理(类型转换,比例缩放,倒影,圆角)
- Word与pdf的互转的方法及注意事项
- 初识RRDTOOL
- Extjs学习总结之23EditGridPanel可编辑表格
- Interger.class 和 Interger.Type的区别
- matlab 进行PCA分析