一、基本概念
主要是指程序可以访问、检测和修改它本身状态或行为的一种能力, 并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。Java 中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在
运行时装配,无需在组件之间进行源代码链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到 JVM 中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。
通过java中的反射机制可以操作字节码文件(读取和修改)==反射机制相关的类在java.lang.reflect.*;包下==
反射机制相关的重要的类:
java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。
二、在java中获取Class的三种方式
第一种:Class c = Class.forName("完整类名");
1.静态方法 2.参数是一个字符串 3.字符串是一个完整的包名 4.完整类名必须有包名,jana.lang也要写
Class c1=null;
Class c2=null;
try {
c1=Class.forName("java.lang.String");//c1代表String类型
c2=Class.forName("java.util.Date"); //Date类型
Class c3=Class.forName("java.lang.Integer");//Integer类型
Class c4=Class.forName("java.lang.System");//System类型
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
第二种:Class c = 对象.getClass();
String s="abc";
Class x=s.getClass();//x代表String.class字节码文件,x代表String类型
System.out.println(c1==x);//true(==判断两个对象的内存地址)
Date date=new Date();
Class y=date.getClass();
System.out.println(c2==y);
第三种:Class c = int.class;(Class c = String.class;)
//第三种方式:java中任何一个类型,包括基本数据类型,都有class属性
Class z=String.class;//x代表String
Class k=Date.class;//k代表Date
Class f=int.class;//f代表int类型
Class e=double.class;//e代表double类型
获取类之后干什么呢?
通过Class的newInstance方法,完成对象的创建,newInstance方法会调用User类的无参构造方法,无参构造必须存在!如果没有这个无参数构造方法会出现"实例化"异常。
示例代码(1): User类:
public class User {
public User() {
System.out.println("无参数构造方法");
}
}
测试类:
import ben.User;
public class ReflectText02 {
public static void main(String[] args) {
//不使用反射机制
User user = new User();
System.out.println(user);
//反射机制创建对象
try {
//通过反射机制获取Class,通过Class实例化对象
Class c = Class.forName("ben.User");//c代表User类型
//newInstance方法会调用User类的无参构造方法,完成对象的创建
Object obj = c.newInstance();
System.out.println(obj);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
运行结果:
无参数构造方法
ben.User@10f87f48
无参数构造方法
ben.User@b4c966a
反射机制灵活性:可以做到不同对象的实例化,
资源绑定器:
java.util包下提供了一个资源绑定器,便于获取属性配置文件的内容,使用此方法时,属性文件必须在类路径下并且属性配置文件必须以.properties结尾。
示例代码:(2):
import java.util.ResourceBundle;
public class ResourceBundleText {
public static void main(String[] args) {
ResourceBundle bundle=ResourceBundle.getBundle("classinfo2");
String className=bundle.getString("className");
System.out.println(className);
}
}
属性配置文件内容:
本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/49000.html
如有侵犯您的合法权益请发邮件951076433@qq.com联系删除