java反射机制可以动态获取类的各种信息,如方法、属性等。并且可以生成该类的对应实例;可以调用任何对象的任何方法,即jvm(虚拟机)允许代码在运行过程中获取类的内部信息
在使用反射机制时,一个非常重要的Class就是Class,它是由类加载后的 JVM(虚拟机)
在运行时确定任何对象的类
在运行时构造任何类的对象;
在运行时确定任何类的成员变量和方法;
在运行时调用任意对象的方法;
生成动态代理;
优势:
运行时可以判断类型并动态加载类,提高了代码的灵活性。访问不可访问的成员变量等;获取类的方法和成员变量;
缺点:
Java反射相当于一系列解释操作。这个过程需要通知jvm(虚拟机),所以性能比直接源码慢很多。它无法识别编译器中的错误。错误只能在运行时发现,增加了难度
java.lang.Class //类
java.lang.reflect.Constructor //构造方法
java.lang.reflect.Field //类的成员变量
java.lang.reflect.Method //类方法
java.lang.reflect.Modifier //访问权限
模块化开发,通过反射调用对应的字节码;
动态代理设计模式
Spring和hibernate框架等
一个结合注解的框架,如Retrofit
例子:
JDBC编程中,加载数据库驱动时应用反射机制;
Class.forName("com.mysql.jdbc.Driver") 加载驱动类并在DriverManager类中注册驱动类实例。
获取类对象的三种方法
1.使用已知对象的“getClass()”方法,例如:
/*
* 如何获取字节码对象:
* 要使用此方法,您必须指定特定的类并创建对象。
*/
公共类 GetClassTest {
/*类的方法和属性*/
公共静态无效get(){
GetClassTest 测试 = 新的 GetClassTest();
Class class = test.getClass();//可以返回<span style = "font family: Arial, Helvetica, sans serif;" > getclasstest 类的类对象</ span>
}
}
2.Class.forName("类名"),例如
/*
* 只要传递给定类的字符串名称,就可以获得该类,扩展性更强。
* 但是可以通过使用Class中的方法来完成。
* 这个方法是forName
* 这种方法只要有名字就更方便,扩展性更好。
*/
公共类 ForNameTest {
/*类的方法和属性*/
公共静态无效get(){
Class class = Class.forName("Package name.RefClass");//加载RefClass Class,生成对应Class对象,初始化RefClass Class;
}
}
3.类名class,例如:
/*
* 任何数据类型都有一个静态属性Class来获取其对应的类图像。
* 比较简单,但是我们还是需要在类中显式使用静态成员。
* 扩展不够。
*/
公共类 ClassTest {
/*类的方法和属性*/
公共静态无效get(){
Class class = RefClass.class;//加载RefClass Class并生成对应的Class对象,但RefClass Class没有初始化;
}
}
可通过类对象获取的信息
class.getName();//获取类名包含包名的路径
class.getPackage();//获取类的包信息
class.getSimpleName();//获取类名
class.getModifiers();//获取类访问权限
class.getDeclaredClasses();//内部类
class.getDeclaringClass();//外部类
class.getType();//字段类型
班级。getModifiers();//字段访问修饰符
class.getMethods();// 获取类中的所有公共方法,包括父类中的方法
class.getDeclaredMethods();// 获取类中的所有方法,包括公共和私有方法,但不包括父类中的方法
class.isPrimitive();//判断是否为基本类型
class.isArray();//判断是否为集合类
class.isAnnotation();//判断是否为注解类
class.isInterface();//判断是否为接口类
class.isEnum();//判断是否为枚举类
class.isAnonymousClass();//判断是否为匿名内部类
class.isAnnotationPresent(Deprecated.class);//判断是否被注解类修改
获取方法的方法名和参数
//遍历所有方法
for (方法 m : 声明方法){
// 获取方法名
System.out.print(m.getName()+"(");
// 用于判断是否为第一个参数
布尔 isFrist = true;
// 获取方法的所有参数类
类<?>[] parameterTypes = m.getParameterTypes();
//遍历所有参数
for (Class<?> clazz : parameterTypes){
如果(isFrist){
System.out.print(clazz.getName());
isFrist = 假;
} 别的 {
System.out.print("," + clazz.getName());
}
}
System.out.println(");");
}
以上就是关于“Java反射机制的应用”介绍,大家如果想了解更多相关知识,不妨来关注一下动力节点的Java在线学习,里面的课程内容细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助哦。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习