概述
JAVA高级特性之——反射
一、什么是反射
JAVA反射机制是在运行状态中,对于任意一个雷,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为JAVA语言的反射机制;
二、JAVA反射相关的类
Class类:代表类的实体,在运行的JAVA应用程序中表示类和接口;
Field类:代表类的成员变量(成员变量也称为类的属性);
Method类:代表类的方法;
Constructor类:代表类的构造方法;
Class类
Class类代表类的实体,在运行的JAVA应用程序中表示类和接口,在这个类中提供了很多有用的方法,简单介绍如下:
方法 | 用途 |
---|---|
asSubclass(Class clazz) | 把传递的类的对象转换成代表其子类的对象 |
Cast | 把对象转换成代表类或者接口的对象 |
getClassLoader() | 获得类的加载器 |
getClasses() | 返回一个数组,数组中包含该类中所有公共类和接口的对象 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有的类和接口类的对象 |
forName(String className | 根据雷鸣返回类的对象 |
getName() | 获得类的完成路径名称 |
newInstance() | 创建类的实例 |
getPackage() | 获得类的包 |
getSimplename() | 获得类的名字 |
getSuperclass() | 获得当前类继承的父亲类的名字 |
getInterfaces() | 获得当前类实现的类或者是接口 |
Field相关方法
方法 | 用途 |
---|---|
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
Method相关方法
方法 | 用途 |
---|---|
getMethod(String name, Class…<?> parameterTypes) | 获得该类某个公有方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name,Class…<?> parameterTypes | 获得该类某个方法 |
getDeclaredMethods() | 获得该类所有方法 |
Constructor相关方法
方法 | 用途 |
---|---|
getConstructor(Class…<?> parameterTypes) | 获得该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获得该类的所有构造方法 |
getDeclaredConstructor(Class…<?> parameterTypes) | 获得该类中参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
其他相关方法
方法 | 用途 |
---|---|
isAnnotation() | 如果是朱姐类型则返回true |
isAnnotationPresent(Class<?extends Annotation> annotationClass | 如果是指定类型朱姐型则返回true |
isAnonymousClass | 如果是匿名类则返回ture |
isArray() | 如果是一个数组类型则返回true |
isEnum() | 如果是一个枚举类则返回true |
isInstance(object obj) | 如果obj是该类的实例则返回true |
isInterface() | 如果是接口则返回true |
isLocalClass | 如果是局部类则返回true |
isMemberClass() | 如果是内部类则返回true |
具体实例如下:
一、定义一个对象User:
对象中有:
- 私有属性:三个私有属性,其中有一个私有属性是有值的;
- 构造方法:两个,一个公有,一个私有;
- 方法:两个,一个公有,一个私有;
接下来会通过反射方式获取对象的相关内容;
package com.example.springbootdemotest.reflect;
public class User {
private String name;
private String add;
private String value = "123456";
public User(String name, String add) {
this.name = name;
this.add = add;
}
private User(String name) {
this.name = name;
}
public User(){
}
private void privateMethod(int i ) {
System.out.println("这是一个私有方法:"+i);
}
public void setName(String name) {
this.name = name;
}
public String getAdd() {
return add;
}
public void setAdd(String add) {
this.add = add;
}
public void getMsg() {
System.out.println(this.name + this.add);
}
public String getName() {
return name;
}
}
构造方法获取:
//通过反射方式生成私有的构造方法;
public static void getPrivateConstructor() {
try {
Class<?> userClass = null;
userClass = Class.forName("com.example.springbootdemotest.reflect.User");
Constructor<?> constructor = userClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
User user = (User) constructor.newInstance("yangpeng");
System.out.println("反射生成私有构造方法----------对象地址为:" + user.hashCode());
} catch (Exception e) {
e.printStackTrace();
}
}
对象获取
//通过反射生成对象:
public static void getObject() {
try {
Class<?> classObject = Class.forName("com.example.springbootdemotest.reflect.User");
User user = (User) classObject.newInstance();
user.setAdd("beijing");
user.setName("yangpeng");
System.out.print("反射生成对象--------对象信息为:");
user.getMsg();
} catch (Exception e) {
e.printStackTrace();
}
}
私有属性获取
//反射私有属性
public static void getPrivateFiled() {
try {
Class<?> classObject = Class.forName("com.example.springbootdemotest.reflect.User");
Object classUser = classObject.newInstance();
Field field = classObject.getDeclaredField("value");
field.setAccessible(true);
String value = (String) field.get(classUser);
System.out.println("获取私有属性成功:value:" + value);
} catch (Exception e) {
e.printStackTrace();
}
}
私有方法获取
//反射私有方法
public static void getPrivateMethod() {
try {
Class<?> classObject = Class.forName("com.example.springbootdemotest.reflect.User");
Object classUser = classObject.newInstance();
Method method = classObject.getDeclaredMethod("privateMethod",int.class);
method.setAccessible(true);
method.invoke(classUser, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
测试
public static void main(String[] args) {
getPrivateConstructor();
getObject();
getPrivateFiled();
getPrivateMethod();
}
//结果:
"C:Program FilesJavajdk1.8.0_211binjava.exe".......
反射生成私有构造方法----------对象地址为:87285178
反射生成对象--------对象信息为:yangpengbeijing
获取私有属性成功:value:123456
这是一个私有方法0
最后
以上就是淡定小笼包为你收集整理的JAVA高级特性之——反射JAVA高级特性之——反射的全部内容,希望文章能够帮你解决JAVA高级特性之——反射JAVA高级特性之——反射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复