其他分享
首页 > 其他分享> > 反射

反射

作者:互联网

反射

1.介绍

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 [1]

许多框架的底层都会用到反射,比如spring的IOC ,注解开发

2.反射使用

2.1 获取字节码文件对象

字节码对象可以在运行期间操作类的构造,成员等,是使用反射的必需对象

三种方式:

  1. 类名.class
  2. 对象名.getClass()
  3. 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