一、java反射机制
什么是反射机制:
反射机制是java的动态机制,可以在程序"运行期间"再确定实例化对象,方法调用,属性操作等
优缺点:
反射机制可以提高代码的灵活度,但是会带来较多的系统开销和较低的运行效率,因此不能过度依赖
学习反射机制前先要了解类对象Class类
JVM加载一个类的class文件时,就会创建一个Class实例与该类绑定。因此每个被加载的类都有且只有一个Class实例,这个实例就是该加载的类的类对象
通过一个类的类对象我们可以获取这个类的一切信息(类名,属性,方法,构造器等)从而在程序运行期间进行相关的操作
获取类对象的方式
public class ReflectDemo {
public static void main(String[] args) throws Exception {
}
}
我们获取了类对象后就可以用得到类的各种信息
举例:获取String类的类对象
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class cls = String.class;
//获取String类的类名
String name = cls.getName();
System.out.println(name);//结果为java.lang.String(完全限定名:包名.类名)
//只获取单独的类名
name = cls.getSimpleName();
System.out.println(name);//结果为String
//获取包名
String packageName = cls.getPackage().getName();
//获取方法
Method[] methods = cls.getMethods();
}
}
使用反射机制实例化对象
public class ReflectDemo {
public static void main(String[] args) throws Exception {
//不使用反射
ArrayList list = new ArrayList();
System.out.println(list);
//使用反射
Class cls = Class.forName("java.util.ArrayList");
Object obj = cls.newInstance();
System.out.println(obj);
}
}
利用反射机制调用方法
public class ReflectDemo4 {
public static void main(String[] args) throws Exception {
//1实例化
//1.1加载类对象
Class cls = Class.forName("reflect.Person");
//1.2实例化
Object obj = cls.newInstance();
//2调用方法
//2.1通过类对象获取要调用的方法
Method method = cls.getMethod(methodName);
//2.2通过方法对象执行该方法
method.invoke(obj);
}
}
反射机制访问注解
public class ReflectDemo7 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("reflect.Person");
//cls所表示的类Person是否被注解@AutoRunClass标注过
boolean flag = cls.isAnnotationPresent(AutoRunClass.class);
if(flag){
System.out.println("被标注了!");
}else{
System.out.println("没有被标注!");
}
}
}



