Class对象、反射机制、获取Constructor构造方法

1、Class对象的三种创建方法(Class首字母大写)
public class Demo {
    public static void main(String[] args){
        Object obj=new Object();//方法一:先new对象,再调用方法,创建Class对象c1
        Class c1=obj.getClass();
        Class c2=Object.class;//方法二:使用.class属性,无需new对象,直接创建Class对象c2
        try {
            //方法三(推荐):调用Class类的forName方法,不需考虑类是否存在,功能强大。
            Class c3=Class.forName("java.lang.Object");
            System.out.println("c3哈希值:"+c3.hashCode());//哈希值判断是否指向同一对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("c1哈希值:"+c1.hashCode());
        System.out.println("c2哈希值:"+c2.hashCode());
    }
}

Class对象的价值:反射机制。

Class对象可以看作某个类的影子,通过影子,可以获得这个类的方法、属性等。

如下案例中,Demo.java中的Class对象c是Example.java的影子。通过c,获得Examp中的方法类型、参数类型等。

      

2、获得Constructor构造方法(java.lang.reflect.Constructor包下)

class.getConstructors()  获取所有公有public构造方法。()内带参数,则获取指定的public构造方法。

class.getDeclaredConstructors()  获取所有构造方法。()内带参数,则获取指定构造方法。

构造方法Constructor的一些属性:getModifiers修饰符、getName名字、getParameterTypes参数类型

public class Demo {
    public static void main(String[] args) {       
        try {
            Class c = Class.forName("Example");//创建类对象。同一包下,直接使用
            Constructor cons[] = c.getDeclaredConstructors();//获取Example中的所有构造方法
            for (Constructor con : cons) {//con.getModifiers()返回Int型,所以转字符串
                System.out.print(Modifier.toString(con.getModifiers()) + " ");//获取修饰符
                System.out.println(con.getName());//方法名
                Class paras[] = con.getParameterTypes();//方法中的参数类型
                for (int i = 0; i < paras.length; i++) {
                    System.out.println(paras[i].getSimpleName());//参数类型的简化名
                }
            }
            //无参数的构造方法。Example中toString
            Constructor cs1 = c.getDeclaredConstructor();//Example中无参数的构造方法
            Object obj = cs1.newInstance();//实例化
            System.out.println(obj.toString());//调用Example中toString方法
            //1个参数的构造方法。Example中id赋值123
            Constructor cs2 = c.getDeclaredConstructor(int.class);//Example中int型参数的构造方法
            obj = cs2.newInstance(123);//实例化
            System.out.println(obj.toString());//调用Example中toString方法
            //3个参数的构造方法。Example中id、name、price赋值
            Constructor cs3 = c.getDeclaredConstructor(int.class, String.class, double.class);//Example中3参数的构造方法
            cs3.setAccessible(true);//private私有方法无法使用,故获取权限
            obj = cs3.newInstance(123, "反射", 3.14);//实例化
            System.out.println(obj.toString());//调用Example中toString方法
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
public class Example {
    int id;
    String name;
    double price;

    //Alt+Insert,Constructor快速创建构造方法
    public Example() {
    }

    public Example(int id) {
        this.id = id;
    }

    private Example(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    //Alt+Insert,toString快速创建构造方法
    public String toString() {//返回Example的值
        return "Example{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

 

 

 
posted @ 2018-08-24 11:01  夕西行  阅读(497)  评论(0编辑  收藏  举报