java 反射例子

本文详细介绍了Java反射机制的使用,包括创建对象、设置属性、调用方法等操作,并探讨了内部类、私有方法的反射调用,强调了构造函数的可见性和访问控制在反射中的影响。
摘要由CSDN通过智能技术生成

 

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

  1.       System.out.println(Inner.class.getConstructors().length);  
  2.       //获取第一个构造函数 
  3.       System.out.println(Inner.class.getConstructors()[0]);  
  4.       //用构造函数初始化内部类 
  5.       System.out.println(Inner.class.getConstructors()[0].newInstance(new Outer()); 

 从上面代码的打印输出可以看到,公开非静态内部类的默认构造函数需要一个外围类的实例。
    如果是public static的内部类,则默认构造函数是一个无参的构造函数。如果把Inner类的public关键字去掉,运行上面代码会发现抛错了,因为找不到Inner的构造函数。这个时候只需要将getConstructors方法换成getDeclaredConstructors就可以了。
    如果内部类是私有的,在初始化的时候要将构造函数的访问设置成true。如下:

  1.       //查看class是否有构造函数 
  2.       System.out.println(Inner.class.getDeclaredConstructors().length);  
  3.       //获取第一个构造函数 
  4.       Constructor c = Inner.class.getDeclaredConstructors()[0];  
  5.       //将c设置成可访问       
  6.       c.setAccessible(true);  
  7.       //用构造函数初始化内部类 
  8. 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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值