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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董将 中级黑马   /  2012-12-20 14:53  /  936 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

首先创建一个Person类,在其中创建三个不同类型的属性变量
public class Person {
        private int age;
        String name;
        public String address;

        public Person() {
        }

        Person(int age) {
                this.age = age;
        }

        public Person(int age, String name) {
                this.age = age;
                this.name = name;
        }

        public void show() {
                System.out.println(age + ":" + name);
        }

        public void function(String s) {
                System.out.println("function " + s);
        }

        public String method(String name, int age) {
                return name + ":" + age + " string";
        }

        private void print() {
                System.out.println("print");
        }

        @Override
        public String toString() {
                return name + ":" + age + ":" + address;
        }
}
在这里首先是要获取到Person对象的字节码文件,获取的方式有以下几种:
public class ReflectDemo {
        public static void main(String[] args) throws ClassNotFoundException {
                // 第一种方式
                Person p = new Person();
                Class c = p.getClass();
                // System.out.println(c);

                Person p2 = new Person();
                Class c2 = p2.getClass();
                System.out.println(p == p2);// false
                System.out.println(c == c2);// true

                // 第二种方式
                Class c3 = Person.class;
                System.out.println(c == c3);

                // 第三种方式 类要写全路径名称
                Class c4 = Class.forName("cn.itcast.reflect.Person");
                System.out.println(c == c4);
        }
}
接下来就是要获取到Person类中的构造方法
public class ReflectDemo2 {
        public static void main(String[] args) throws Exception {
                // 获取字节码文件对象
                Class c = Class.forName("cn.itcast.reflect.Person");

                // 获取构造方法
                // Constructor[] cons = c.getConstructors();
                Constructor[] cons = c.getDeclaredConstructors();
                for (Constructor con : cons) {
                        System.out.println(con);
                }

                /*
                 * Person p = new Person(); sop(p);
                 */
                System.out.println("*******************************");
                // 通过Class的newInstance方法创建对象
                Object obj = c.newInstance(); // 默认调用的是无参构造方法
                System.out.println(obj);

                System.out.println("*******************************");
                // 获取单个构造方法
                //Constructor<T> getConstructor(Class<?>... parameterTypes)
                //Class数组其实就是参数的Class类型数组
                //获取的是无参构造方法
                Constructor c1 = c.getConstructor();
                //如果通过c1创建对象
                //T newInstance(Object... initargs)
                //Object...数组其实就是参数的Object类型数组
                /*
                 * Person p = new Person();
                 * Person p = new Person("张三",20);
                 */
                Object obj1 = c1.newInstance();
                System.out.println(obj1);
               
                System.out.println("*******************************");
                //如果得到有参数构造创建的对象呢
                Class[] classes = new Class[2];
                classes[0] = int.class;
                classes[1] = String.class;
                Constructor c2 = c.getConstructor(classes);
               
                //通过带参构造方法创建对象
                Object[] objs = new Object[2];
                objs[0] = 20;
                objs[1] = "zhangsan";
                Object obj2 = c2.newInstance(objs);
               
                System.out.println(obj2);

        }
}
接下来就是创建对象了,创建对象的方法
public class ReflectDemo3 {
        public static void main(String[] args) throws Exception {
                Class c = Class.forName("cn.itcast.reflect.Person");

                // 获取带参构造方法
                // 第一种
                // Class[] classes = new Class[2];
                // classes[0] = int.class;
                // classes[1] = String.class;
                // Constructor con = c.getConstructor(classes);
                // 第二种
                // Constructor con = c.getConstructor(new Class[] { int.class,
                // String.class });
                // 第三种 可变参数会自动把这两个参数包装成一个Class类型的数组
                Constructor con = c.getConstructor(int.class, String.class);

                // 创建对象
                // Object[] objs = new Object[2];
                // objs[0] = 20;
                // objs[1] = "lisi";
                // Object obj = con.newInstance(objs);
                Object obj = con.newInstance(20, "lisi");

                System.out.println(obj);
        }
}
这些都是基本代码,如有错误,敬请指正,共同学习

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马