一、通过反射机制实例化对象

使用反射机制实例化对象比较灵活。

  • Java代码只需写一遍,在不改变Java源代码的基础之上,可以做到不同对象的实例化。
  • 非常灵活(符合OCP开闭原则:对扩展开放,对修改关闭。)
/*获取到Class,能干什么呢?
*      通过Class的newInstance方法来实例化对象。
*       注意:newInstance方法内部实际上调用无参数构造方法,必须保证无参构造方法存在才可以。*/
public class test03{
    public static void main(String args[]){
        //不使用反射机制,创建对象,
        //User user = new User();
        //下面这段代码使用反射机制的方式创建对象
        try {
            //通过反射机制,获取Class,通过class来实例化对象:
            Class c= Class.forName("User");//c代表user类型
            //newInstance();这个方法会调用User这个类的无参构造方法,来完成对象的创建。
            //重点:newInstance();调用的是无参构造方法,必须保证无参构造方法存在才可以。
            Object obj = c.newInstance();
            System.out.println(obj);/*-->这是一个无参构造方法
                                        User@3764951d*/
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

    }
}
class User{
    public User(){
        System.out.println("这是一个无参构造方法");
    }
}

二、通过读属性文件实例化对象

import java.io.FileReader;
import java.util.Properties;
public class test03{
    public static void main(String args[])throws  Exception{
        //不使用反射机制,创建对象,这种方式代码就写死了,只能创建一个User类型的对象
        //User user = new User();
        //下面这段代码使用反射机制的方式创建对象,比较灵活;
        //代码不需要改动,可以修改配置文件,来创建出不同的实例化对象:
        //通过IO流读取classinfo.properties文件
        FileReader reader = new FileReader("swing/classinfo.properties");
        //创建属性类对象Map
        Properties pro= new Properties();//key  value都是String
        //加载
        pro.load(reader);
        //关闭流
        reader.close();
        //通过key获取value
        String className = pro.getProperty("className");
        //System.out.println(className);//java.lang.Object
        //通过反射机制,获取Class,通过class来实例化对象:
            Class c= Class.forName(className);
            Object obj = c.newInstance();
            System.out.println(obj);//-->java.lang.Object@66d3c617
    }
}
class User{
    public User(){
        System.out.println("这是一个无参构造方法");
    }
}

属性配置文件:classinfo.properties 

//属性配置文件
className=java.lang.Object

三、如果只要静态代码块执行,使用Class.forName(”完整类名“);

/*Class.forName()发生了什么?
*   重点:如果只希望静态代码块执行,其他的代码一律不执行,则可以使用:
*           Class.forName(“完整类名”);
* 这个方法的执行会导致类加载--->类加载时 ,静态代码块就执行了.
* 提示:后面的JDBC技术的时候我们就会用到。。*/
public class test03{
    public static void main(String args[]){
        try {
            //Class.forName()这个方法的执行会导致:类加载
            Class c = Class.forName("User");    //静态代码块执行了
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}
class User{
    //静态代码块在**类加载时**执行,并且只执行一次,
    static {
        System.out.println("静态代码块执行了");
    }
}

重点:如果只希望静态代码块执行,其他的代码一律不执行,则可以使用:

  •  Class.forName(“完整类名”);
  • * 这个方法的执行会导致类加载--->类加载时 ,静态代码块就执行了.

 四、资源绑定器

java.util包下提供了一个资源绑定器,用于获取属性配置文件中的内容。
使用该方式时,属性配置文件必须放在类路径下;
资源绑定器,只能绑定xxx.properties文件 。

public static final ResourceBundle getBundle(String baseName)

资源绑定器的代码实现:

package src;
import java.util.ResourceBundle;

/*java.util 包下提供了一个资源绑定器,便于获取属性配置文件中的内容。
* 使用以下方法,属性配置文件xxx.properties必须放到"类路径"下。 */
public class test{
    public static void main(String args[]){
        //资源绑定器,只能绑定属性配置文件xxx.properties格式的。
        //在写路径的时候,路径后面的扩展名不能写
        ResourceBundle bundle = ResourceBundle.getBundle("test/classinfo2");
        String className = bundle.getString("className");
        System.out.println(className);//java.lang.Object
    }
}

配置文件:

//属性配置文件
className=java.lang.Object

 如果你觉得博主的文章的不错或者对你有帮助,可以点一个免费的关注支持一下博主,你的鼓励将是我创作的最大动力!!