A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐晓 中级黑马   /  2013-1-28 22:46  /  1583 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1.         public static void main(String[] args)throws Exception {
  2.                 // TODO Auto-generated method stub
  3.        
  4.                 Constructor[] constructors=Outer1.class.getConstructors();
  5.                 System.out.println(constructors.length);
  6.                 for(Constructor constructor:constructors){
  7.                
  8.                 Method[] Methods=Outer1.class.getMethods();
  9.                 for(Method Method:Methods){
  10.                         if(Method.getName()=="method")
  11.                                 {
  12.                                 System.out.println(constructor.getName());
  13.                                 Outer1 out=(Outer1)constructor.newInstance();
  14.                                 Object obj=Method.invoke(out);   //如果打开Outer类的in.method,这里能打印内部类的值
  15.                                 System.out.println(Method.getName());
  16.                                 String propertyName = "x";
  17.                                 PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,out.getClass());  //这里好像得到的是Outer的SetX方法,换了obj.getClass下面就不执行了。这里能够得到内部类的SetX方法然后设置值吗?
  18.                                 Method methodSetX = pd2.getWriteMethod();
  19.                                 System.out.println(methodSetX.getName());
  20.                                 methodSetX.invoke(obj,8);
  21.                                 }
  22.                        
  23.                 }
  24.                
  25.         }
  26.   }
复制代码
  1. class Outer1
  2. {
  3.         public Outer1(){}
  4.         private int x = 3;
  5.         public int getX() {
  6.                         return x;
  7.                 }
  8.                 public void setX(int x) {
  9.                         this.x = x;
  10.                 }
  11.        
  12.         class Inner//内部类
  13.         {
  14.                
  15.                 private int x=1;
  16.                 public int getX() {
  17.                         return x;
  18.                 }
  19.                 public void setX(int x) {
  20.                         this.x = x;
  21.                 }
  22.                 public void function()
  23.                 {
  24.                         //int x = 6;
  25.                         System.out.println("innner :"+this.x);
  26.                 }
  27.         }

  28.         /**/
  29.         public void method()
  30.         {
  31.                 Inner in = new Inner();
  32.                 //in.function();
  33.         }
  34. }
复制代码
下面是错误提示,为什么还会出异常呢?

QQ截图20130128224313.jpg (54.39 KB, 下载次数: 81)

QQ截图20130128224313.jpg

3 个回复

倒序浏览
本帖最后由 刘军亭 于 2013-1-29 00:29 编辑

遍历for(Method Method:methods)出错了,下边都写成这样了,我给改了
回复 使用道具 举报
修改完后对内部类的反射,你仔细看看吧!其中已做了注释

package cn.liu.javaenhance;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectInner {

    public static void main(String[] args)throws Exception {

            //获得Outer1类的构造函数
        Constructor[] constructors=Outer1.class.getConstructors();
        System.out.println(constructors.length);
      
        //遍历得到的constructors数组
        for(Constructor constructor:constructors){
               
                //获取Outer1类的方法
                Method[] methods=Outer1.class.getMethods();
               
                //遍历得到的methods数组
                for(Method method:methods){
                       
                if(method.getName()=="method"){
                        System.out.println(constructor.getName());
                       
                        Outer1 out=(Outer1)constructor.newInstance();
                       
                        //这个方法返回一个内部类对象,之前你的Outer1类中的method方法是没有返回对象的。
                        //下边的methodSetX。invoke(obj,8);obj为null。所以程序报空指针异常
                        Object obj=method.invoke(out);  
                       
                        System.out.println(method.getName());
                       
                        String propertyName = "x";
                       
                        //根据获得的内部类对象获取关于X的属性描述符对象
                        PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,obj.getClass());
                        //获得setX()方法对象
                        Method methodSetX = pd2.getWriteMethod();
                       
                        System.out.println(methodSetX.getName());
                       
                        methodSetX.invoke(obj,8);//调用Inner类的setX()方法。
                       
                        System.out.println(pd2.getReadMethod().invoke(obj));//打印内部类变量x设置后的值。
                       
                        }
                }
        }}
}
//-----------------------------------------------------------------------------------------------------
package cn.liu.javaenhance;

class Outer1
{
        public Outer1(){}
        
        private int x = 3;
        
        public int getX() {
                return x;
        }
        public void setX(int x) {
                this.x = x;
        }
        
        class Inner//内部类
        {
               
                private int x=1;
                public int getX() {
                    return x;
                }
                public void setX(int x) {
                        this.x = x;
                }
                public void function()
                {
                        //int x = 6;
                        System.out.println("innner :"+this.x);
                }
        }

        /**/
        public Inner method()//此方法应该返回一个内部类对象
        {
                //Inner in = new Inner();//这种写法只能在本类中使用,在其他类中无法访问,因为不知道这个内部类在哪个外部类中。所以无法访问
                Outer1.Inner in = new Outer1().new Inner();//这种写法是在其他类中调用Outer1中Inner类的对象
                return in;
            //in.function();
        }
}
回复 使用道具 举报
刘军亭 发表于 2013-1-29 00:26
修改完后对内部类的反射,你仔细看看吧!其中已做了注释

package cn.liu.javaenhance;

非常感谢,我知道错在哪里了,原来是method返回viod后导致不能再去调用内部类的方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马