java 反射例子
来源:互联网 发布:民族性格知乎 编辑:程序博客网 时间:2024/04/30 09:00
public void setId(String id) {...}
String str="com.spring.event.Admin";
Class c=Class.forName(str);
Object obj=c.newInstance();
// 这里是里设置属性的值
Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")});
m.invoke(obj,new Object[]{"penghao122"});
比如我们做如下操作br.insert(4, 'u');用反射机制实现如下。
Class[] paratypes = new Class[]{int.class,char.class};
Method method = cla.getMethod("insert", paratypes);
Object[] paralists = new Object[]{4,'u'};
method.invoke(obj, paralists);
有个调用,使用.invoke(obj, paralists)时说wrong number of arguments
改为.invoke(obj,3,4)正常,未找到原因。
从一个已有的类(如下面的foo)进行反射
Foo foo = new Foo("这个一个Foo对象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新设置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
对于内部类,我们需要像下面这样写代码:
Class<?> cls = Class.forName("package.ClassName$InnerClass");
Class.forName("A$B").newInstance(); // A前面需要加上其包名
当然,构造类的时候还是要遵循Java的可见性的,比如在其他类里面就没有办法初始化一个类中的私有内部类。
http://blog.csdn.net/id19870510/article/details/4965623
- System.out.println(Inner.class.getConstructors().length);
- //获取第一个构造函数
- System.out.println(Inner.class.getConstructors()[0]);
- //用构造函数初始化内部类
- System.out.println(Inner.class.getConstructors()[0].newInstance(new Outer());
从上面代码的打印输出可以看到,公开非静态内部类的默认构造函数需要一个外围类的实例。
如果是public static的内部类,则默认构造函数是一个无参的构造函数。如果把Inner类的public关键字去掉,运行上面代码会发现抛错了,因为找不到Inner的构造函数。这个时候只需要将getConstructors方法换成getDeclaredConstructors就可以了。
如果内部类是私有的,在初始化的时候要将构造函数的访问设置成true。如下:
- //查看class是否有构造函数
- System.out.println(Inner.class.getDeclaredConstructors().length);
- //获取第一个构造函数
- Constructor c = Inner.class.getDeclaredConstructors()[0];
- //将c设置成可访问
- c.setAccessible(true);
- //用构造函数初始化内部类
- System.out.println(c.newInstance(new Outer());
当然,构造类的时候还是要遵循Java的可见性的,比如在其他类里面就没有办法初始化一个类中的私有内部类。
利用java反射机制调用类的私有方法
cl=Singleton.class;
Method m1 =cl.getDeclaredMethod("getInstance");
m1.setAccessible(true);// 调用private方法的关键一句话
m1.invoke(cl);
http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html
Class object 诞生管道
示例
运用getClass()
注:每个class 都有此函数
String str = "abc";
Class c1 = str.getClass();
运用
Class.getSuperclass()
Button b = new Button();
Class c1 = b.getClass();
Class c2 = c1.getSuperclass();
运用static method
Class.forName()
(最常被使用)
Class c1 = Class.forName ("java.lang.String");
Class c2 = Class.forName ("java.awt.Button");
Class c3 = Class.forName ("java.util.LinkedList$Entry");
Class c4 = Class.forName ("I");
Class c5 = Class.forName ("[I");
运用
.class 语法
Class c1 = String.class;
Class c2 = java.awt.Button.class;
Class c3 = Main.InnerClass.class;
Class c4 = int.class;
Class c5 = int[].class;
运用
primitive wrapper classes
的TYPE 语法
Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;
- java 反射经典例子
- Java反射例子
- java反射实现例子
- java反射的例子
- JAVA 反射例子
- java类反射例子
- java反射小例子
- java反射小例子
- java 反射小例子
- java 反射例子
- Java反射小例子
- java反射机制例子
- JAVA反射demo例子
- java反射小例子
- java 反射例子汇总
- java反射例子
- java 反射 例子
- JAVA反射例子
- struts2(上)
- 循环队列
- 模拟相位解调
- linux中断流程详解
- 很容易的制作双色表格
- java 反射例子
- CodeSmith生成实体类模板
- Java对象的序列化
- ACM题几个错误原因(持续更新)
- socket 、webservices、Json的区别
- 360黑匣子之谜——奇虎360“癌”性基因大揭秘
- dll的弱引用和强引用
- 算法 shell排序法 - 改良的插入排序
- 使思维导图的清晰度更高