通过反射创建类的对象

反射简介

反射机制提供的主要功能是:得到一个对象所属的类,获取一个类的所有成员变量与方法,在运行时创建对象,在运行时调用对象的方法。
反射指的是根据对象来取得对象的源信息,反射核心方法是Object类中提供的getClass()方法,
返回值是class对象,这个class描述的就是类。任何一个类在JVM中都有唯一的一个class对象,此时对象记录该类的组成机构,当类加载时有JVM产生,用户只能取得此对象无法创建,要想在JVM中应用反射,首先得取得class对象,当使用类对象调用getclass,会输出类的当前位置,此时通过对象取得对象的来源,就是反的本质。在反射的世界中,看重的不再试一个对象,而是对象身后的组成(类,构造,普通,成员等)。

获取class类对象

class类是描述整个类的概念,也是整个反射的操作源头,在使用class类的时侯需要关注的依然是这个类的对象。而这个类的对象产生模式一共有三种:
1.任何类的实例化对象可以通过Object类中的getClass()方法取得class类对象
2.“类.class”,直接根据某个具体的类来取得class类的实例化对象
3.使用class类提供的方法:public static Class forName(String className) throws ClassNotFoundException

package www.practice;
class Data{
    private  int a=2;
    public int c=3;
    public void fun(){
        System.out.println("*********");
    }
}
public class Test5 {
        public static void main(String[] args)throws ClassNotFoundException {
            System.out.println(Data.class); //方法2
            Class<?> cls = Class.forName("www.practice.Data"); //方法3
            System.out.println(cls);  
            Data data=new Data();
            System.out.println(data.getClass());  //方法1
   }
}

以上给出的三个方法中可看出,除了第一种方法会产生Data的实例化对象之外(其实还因为new),其他两个则不会。于是取得了class类对象有一个最直接的好处,可以通过反射实例化对象,在class类中定义如下方法:
public T newInstance()
throws ClassNotFoundException,InstantiationException,IllegalAccessException
Class提供的普通方法,需要通过类的Class对象调用。 调用无参构造,莫有无参构造,则不能使用Class进行创造对象。权限不是public时,此方法也无法使用。

反射实例化对象:

package www.practice;
class Data{
    private  int a=2;
    public int c=3;
    public void fun(){
        System.out.println("*********");
    }
}
public class Test5 {
        public static void main(String[] args)throws ClassNotFoundException,InstantiationException,IllegalAccessException {

            Class<?> cls=Class.forName("www.practice.Data");
            Object obj=cls.newInstance();  //实例化对象,等价于 new www.praction.Data();
            System.out.println(obj);
   }
}

除了关键字new之外,对于对象的实例化模式有了第二种做法,通过反射实现,取得class对象就是意味着取得了一个指定类的操作权。

Java创建对象的方式一共有几种?

共有4种方式可以创建
1.通过new语句实例化一个对象
2.通过反射机制创建对象,见上述
3.通过clone()方法创建一个对象(对象的深浅拷贝)
4.通过反序列化的方式创建对象(序列化与反序列化)

你可能感兴趣的:(JavaSE)