一、通过反射机制实例化对象
使用反射机制实例化对象比较灵活。
-
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
如果你觉得博主的文章的不错或者对你有帮助,可以点一个免费的关注支持一下博主,你的鼓励将是我创作的最大动力!!