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; |