反射
作者:互联网
反射
1.介绍
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 [1]
- 反射:程序运行期间对某个类的内部进行操作
许多框架的底层都会用到反射,比如spring的IOC ,注解开发
2.反射使用
2.1 获取字节码文件对象
字节码对象可以在运行期间操作类的构造,成员等,是使用反射的必需对象
三种方式:
- 类名.class
- 对象名.getClass()
- Class.forName(" 类的全限定名") --》最安全,性能最好
2.2 基本使用
反射使用
public class Test {
public static void main(String[] args) throws Exception{
//获取字节码对象
Class<?> aClass = Class.forName("com.sheep.fanshe.User");
//获取构造
Constructor<?> constructor = aClass.getDeclaredConstructor();//无参构造
User user = (User) constructor.newInstance();//创建实例对象(默认使用无参构造创建)
user.setName("zs");
user.setAge(12);
System.out.println(user);//User{name='zs', age=12}
//获取成员变量
Field field = aClass.getDeclaredField("name");
field.setAccessible(true);//暴力反射 可以获取私有成员
field.set(user,"sbsb");
System.out.println(user);//User{name='sbsb', age=12}
//获取成员方法
Method method = aClass.getDeclaredMethod("method");
method.invoke(user);//方法执行
Method method1 = aClass.getDeclaredMethod("method1");
method1.setAccessible(true);//暴力反射
method1.invoke(user);//私有方法执行
}
}
类
public class User {
private String name;
private Integer age;
private String field = "哈哈";
public User(){}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
private User(String name){
this.name= name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void method(){
System.out.println("方法执行");
}
private void method1(){
System.out.println("私有方法执行");
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.3 使用2
public class Test {
public static void main(String[] args) throws Exception {
//获取字节码对象
Class<?> aClass = Class.forName("com.sheep.fanshe.UserServiceImpl");
Class<?> aClass1 = Class.forName("com.sheep.fanshe.UserService");
//判断类是否为接口
boolean anInterface = aClass.isInterface();
System.out.println(anInterface);//false
System.out.println(aClass1.isInterface());//true
//获取所有实现的接口
Class<?>[] interfaces = aClass.getInterfaces();//com.sheep.fanshe.UserService java.io.Serializable
for (Class<?> anInterface1 : interfaces) {
System.out.println(anInterface1.getName());
}
//获取注解属性(spring注解开发)
boolean annotationPresent = aClass.isAnnotationPresent(Annotation1.class);
if (annotationPresent) {
Annotation1 annotation = aClass.getAnnotation(Annotation1.class);
System.out.println(annotation.name());
}
}
}
注解:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Annotation1 {
String name() default "1";
}
接口
public interface UserService {
String test();
}
类
@Annotation1(name = "11")
public class UserServiceImpl implements UserService,Serializable {
@Override
public String test() {
return "test";
}
}
标签:aClass,String,反射,age,User,public,name 来源: https://www.cnblogs.com/cutesheep/p/15070497.html