Java反射机制(Java Reflection)是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、父类等信息,还包括实例的创建和实例类型的判断等。
有时具体要用到哪个类的对象只有实际运行过程中才能决定,没法预先知晓,利用反射机制,就可以在运行过程当中根据名称字符串来决定创建什么类的对象。
这里示范一种很常用的方法,利用Class类的forName()和newInstance()根据已知类名字符串来返回该类的实例。
forName(String className)方法可以返回与带有给定字符串名的类或接口相关联的Class对象;
newInstance()方法创建类的一个新实例;
- 先给出接下来要写的出的文件的目录情况,让零基础学习者看的更明白一些,注意Main是在reflection下,不是在my下哦!
- 首先编写一个Test类(名称可以自己随心起),在其中编写getObject方法(声明为static可以直接用类名调用方法,不需要先实例化再调用),输入参数className为表示类名的字符串,返回的是一个Object实例。
- 注意必须写成try catch语句,因为根据输入的字符串className找不到对应的类时会产生ClassNotFoundException
package reflection.my;
public class Test {
public static Object getObject(String className) {
try {
Class c = Class.forName(className);
Object object = c.newInstance();
return object;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
- 编写两个类Class1,Class2
package reflection.my;
public class Class1 {
public Class1() {
System.out.println("Class1~~~");
}
}
package reflection.my;
public class Class2 {
public Class2() {
System.out.println("Class2~~~");
}
}
- 接下来在主函数中调用该方法,需要import上面写过的Test、Class1、Class2,然后运行,看看我们不同的输入会得到什么输出
package reflection;
import reflection.my.Class1;
import reflection.my.Class2;
import reflection.my.Test;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String className = scanner.next();//输入字符串
Object object = Test.getObject(className);//调用getObject方法,得到一个实例
//简单测试一下得到的实例是什么类型
if (object instanceof Class1) {
System.out.println("是Class1");
} else if (object instanceof Class2) {
System.out.println("是Class2");
}
}
}
- 第一次输入reflection.my.Class1
- 第二次输入reflection.my.Class2
- 第三次输入Class1,可以看到不写清楚路径是找不到这个类的会报错,所以一定要写清楚的!
- Java现成的类也是一样的,如果输入java.lang.String,那么得到的就是String类型的实例,注意一定要带上前面的包名,不能光写个String哦
我自己目前是在复习设计模式,经常用到反射机制+配置文件来实现开闭原则(OCP),所以知识面也比较窄,这里只是根据自己用到的反射机制来写的
说明一下,本人也是个基础薄弱的学生,之前没有写博客的习惯,才刚开始写,当做复习知识了,所以有写的不好的地方请多包涵,欢迎指正,欢迎留言~