Itcast_01

获取class文件对象三种的方式

反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。    
    Person p = new Person();
    p.使用
    
    要想这样使用,首先你必须得到class文件对象,其实就是得到Class类的对象    Class类:
        成员变量      Field
        构造方法      Constructor
        成员方法      Method
    
    获取class文件对象的方式: 

   A:Object类的getClass()方法
    B:数据类型的静态属性class
    C:Class类中的静态方法        

public static Class   forName(String className)
    
    一般我们到底使用谁呢?            

A:自己玩   任选一种,第二种比较方便            
B:开发    第三种
                为什么呢?因为第三种是一个字符串,而不是一个具体的类名,这样我们可以把这样的字符串配置到配置文件中。

Person.java

package cn.itcast_01;
    
    public class Person {
        private String name;
        int age;
        public String address;
    
        public Person() {
    
        }
    
        private Person(String   name){
            this.name = name;
        }
    
        Person(String name, int age)   {
            this.name = name;
            this.age = age;
        }
    
        public Person(String name, int   age, String address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }
    
        public void show() {
              System.out.println("show");
        }
    
        public void method(String s)   {
              System.out.println("method "+s);
        }
    
        public String getString(String s,   int i) {
            return s + "---" +   i;
        }
    
        private void function() {
              System.out.println("function");
        }
    
        @Override
        public String toString() {
            return "Person{"   +
                    "name='" +   name + '\\'' +
                    ", age=" +   age +
                    ",   address='" + address + '\\'' +
                    '}';
        }
    }

ReflectDemo.java

package cn.itcast_01;
    
    /*
    反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。    
    Person p = new Person();
    p.使用
    
    要想这样使用,首先你必须得到class文件对象,其实就是得到Class类的对象    Class类:
        成员变量      Field
        构造方法      Constructor
        成员方法      Method
    
    获取class文件对象的方式:    A:Object类的getClass()方法    B:数据类型的静态属性class
    C:Class类中的静态方法        public static Class   forName(String className)
    
    一般我们到底使用谁呢?            A:自己玩   任选一种,第二种比较方便            B:开发    第·三种
                为什么呢?因为第三种是一个字符串,而不是一个具体的类名,这样我们可以把这样的字符串配置到配置文件中。    
     */
    public class ReflectDemo {
        public static void main(String[]   args) throws ClassNotFoundException {
            //  方式1
            Person p = new   Person();
            Class c = p.getClass();
    
            Person p2 = new   Person();
            Class c2 =   p2.getClass();
    
            System.out.println(p ==   p2);//  false
            System.out.println(c ==   c2);//  true
    
            //  方式2
            Class c3 =   Person.class;
            //  int.class;
            //  String.class;
            System.out.println(c ==   c3);
    
            //  方式3
            //  ClassNotFoundException
            Class c4 =   Class.forName("cn.itcast_01.Person");
            System.out.println(c ==   c4);
        }
    }

Itcast_02

通过反射获取无参构造方法并使用

ReflectDemo.java

package cn.itcast_02;
    
    import cn.itcast_01.Person;
    
    import java.lang.reflect.Constructor;
    
    /*
    通过反射获取构造方法并使用。     */
    public class ReflectDemo {
        public static void main(String[]   args) throws Exception {
            //  获取字节码文件对象            Class c =   Class.forName("cn.itcast_01.Person");
    
            //  获取构造方法            //  public Constructor[] getConstructors() :所有公共构造方法            //  public Construcor[]  getDeclaredConstructors() :所有构造方法            //Constructor[] cons =   c.getDeclaredConstructors();
            //for (Constructor con :   cons) {
            //    System.out.println(con);
            //}
    
            // 获取单个构造方法            // public   Constructor<T> getConstructor(Class<?>... parameterTypes)
            // 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象            Constructor con =   c.getConstructor();//     返回的是构造方法对象    
            //  Person p = new Person();
            //  System.out.println(p);
            //  public T newInstance(Object...   initargs)
            //  使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。            Object obj =   con.newInstance();
              System.out.println(obj);
    
            Person p = (Person) obj;
            p.show();
    
        }
    }

通过反射获取带参构造方法并使用

ReflectDemo2.java

package cn.itcast_02;
    
    import java.lang.reflect.Constructor;
    
    /*
    需求:通过反射去获取该构造方法并使用:    public Person(String name, int age, String address)
    
    Person p = new Person("林青霞",27,"北京");
    System.out.println(p);
     */
    public class ReflectDemo2 {
        public static void main(String[]   args) throws Exception{
            // 获取字节码文件对象            Class c =   Class.forName("cn.itcast_01.Person");
    
            // 获取带参构造方法对象            // public   Constructor<T> getConstructor(Class<?>... parameterTypes)
            Constructor con =   c.getConstructor(String.class,int.class,String.class);
    
            // 通过带参构造方法对象创建对象            // public T   newInstance(Object... initargs)
            Object obj =   con.newInstance("林青霞",27,"北京");
    
              System.out.println(obj);
    
        }
    }
输出结果:Person{name='林青霞', age=27, address='北京'}