首页 > 其他分享 >反射

反射

时间:2023-08-11 09:23:21浏览次数:17  
标签:反射 name age System println public out

1、什么是反射

   反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

2、获取Class的三种方式   第一种: Class.forName("类路径")
//第一种:根据student类的路径获取Student的反射类对象
Class<Student> aClass = (Class<Student>) Class.forName("FanSe1.Student");
System.out.println(aClass);

  第二种: 类名.class

//第二种:根据类的名获取Student类的反射对象
Class<Student> studentClass = Student.class;
Student student1 = studentClass.newInstance();
System.out.println("第二种:"+student1);

  第三种: 对象.getClass();

//第三种:通过类对象获取类的反射类对象
Student student = new Student();
Class aClass1 = student.getClass();

aClass == studentClass == aClass1 反射类相同

3、通过反射类获取类的对象

  通过Class类对象,调用newInstance()

//第一种:根据student类的路径获取Student的反射类对象
Class<Student> aClass = (Class<Student>) Class.forName("FanSe1.Student");
System.out.println(aClass);
//通过反射类得到对应的类对象---之前方式:new Student来获取Student类对象
Student aClassstudent = aClass.newInstance();
System.out.println("第一种:"+aClassstudent);

 4 获取反射类中的属性成员对象

  字节码中的属性成员被加载到内存中后会以Field类对象的形式存在。如何获取Field属性对象。

  类:

class Student2{
    private String name;
    private Integer age;
    public String hopp;
    Integer qqq;

    public String getHopp() {
        return hopp;
    }

    public void setHopp(String hopp) {
        this.hopp = hopp;
    }

    public Integer getQqq() {
        return qqq;
    }

    public void setQqq(Integer qqq) {
        this.qqq = qqq;
    }

    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 show(){
        System.out.println("名字:"+name);
        System.out.println("年龄:"+age);
    }

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hopp='" + hopp + '\'' +
                ", qqq=" + qqq +
                '}';
    }

  · getDeclaredFields() --查询类中所有的类对象

//1、获取Student2类的反射类
Student2 student2 = new Student2();
Class aClass2 = student2.getClass();
//获取反射类中的成员对象 --获取本类中所有的属性对象
Field[] declaredFields = aClass2.getDeclaredFields();
for (Field field : declaredFields) {
    System.out.println("==="+field);
}

   ·getDeclaredField --通过类的名字获取类对象

//1、获取Student2类的反射类
Student2 student2 = new Student2();
Class aClass2 = student2.getClass();
//通过类的名字获取参数
Field declaredField = aClass2.getDeclaredField("name");
System.out.println("----"+declaredField);

   ·getFields()   --获取本类以及父类中public属性对象

//1、获取Student2类的反射类
 Student2 student2 = new Student2();
Class aClass2 = student2.getClass();
//获取本类以及父类中public属性对象
Field[] fields = aClass2.getFields();
for (Field field : fields) {
    System.out.println("-=-="+field);
}

   ·getField()  --指定名称的公共字段的对象

//1、获取Student2类的反射类
Student2 student2 = new Student2();
Class aClass2 = student2.getClass();
//指定名称的公共字段的对象
Field name = aClass2.getField("hopp");
System.out.println("+_+"+name);

5、Field类中具有的常用方法

  · setAccessible(true): 设置允许访问私有属性

  · getAnnotation(注解.class):获取属性上的注解对象

//1、获取反射类对象
Class<Student3> student3Class = Student3.class;
//2、通过反射类得到类对象
Student3 student3 = student3Class.newInstance();
System.out.println(student3);
//3、得到反射类中的age属性对象
Field age = student3Class.getDeclaredField("age");
//通过age属性对象为Student对象赋值
age.set(student3,18);
System.out.println(student3);
//4、获取私有的反射类中的name属性对象
Field name = student3Class.getDeclaredField("name");
//允许私有的属性赋值
name.setAccessible(true);
name.set(student3,"张三");
System.out.println(student3);

 

class Student3{
    private String name;
    public Integer age;

    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 show(){
        System.out.println("名字:"+name);
        System.out.println("年龄:"+age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

 

 6、获取方法类对象

方法类对象:

class ZhangSan{
    public void fun1(){
        System.out.println("-----");
    }
    public String fun2(int age){
        System.out.println("===="+age);
        return "fun2";
    }
    private String fun3(String name){
        return "fun3"+name;
    }
    private String fun4(){
        return "fun4";
    }

   ·getDeclaredMethods()  --查询类中所有的方法类对象

Class<ZhangSan> zhangSanClass = ZhangSan.class;
ZhangSan zhangSan = zhangSanClass.newInstance();
//获取本类中所有的Method方法对象
Method[] declaredMethods = zhangSanClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
    System.out.println("Method方法对象:"+declaredMethod);
}

   ·getMethods()   --获取本类以及父类中public修饰的方法对

Class<ZhangSan> zhangSanClass = ZhangSan.class;
ZhangSan zhangSan = zhangSanClass.newInstance();
//获取本类以及父类中public修饰的方法对象
Method[] methods = zhangSanClass.getMethods();
for (Method method : methods) {
    System.out.println("获取公共方法类:"+method);
}

   ·getMethod("类名",类型.class)  --查询类中公共public指定的方法对象

Class<ZhangSan> zhangSanClass = ZhangSan.class;
ZhangSan zhangSan = zhangSanClass.newInstance();
//查询类中指定的方法对象
Method method = zhangSanClass.getMethod("fun2",int.class);
System.out.println("+++"+method);

 7、Method类中常用的方法

    · invoke(): 执行该方法体。

     Class<ZhangSan1> zhangSan1Class = ZhangSan1.class;
        ZhangSan1 zhangSan1 = zhangSan1Class.newInstance();
        Method fun3 = zhangSan1Class.getMethod("fun3", int.class, String.class);
        //回调该方法   执行该方法
        Object zs = fun3.invoke(zhangSan1, 16, "张三");
        System.out.println(zs);
class ZhangSan1{
    public String fun3(int age,String name){
        System.out.println(age);
        System.out.println(name);
        return "fun3";
    }
}

    · getAnnotation()  --返回该元素的指定类型的注释,否则返回null

BH annotation = fun3.getAnnotation(BH.class);
System.out.println(annotation.value());
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface BH{
    String value();
}
class ZhangSan1{
    @BH("今日复明日,明日何其多")
    public String fun3(int age,String name){
        System.out.println(age);
        System.out.println(name);
        return "fun3";
    }
}

 8、获取构造对象

构造函数:

class A {
    public A() {
        System.out.println("父类的无参构造函数");
    }

    public A(String name) {
        System.out.println("这是父类的有参构造函数:" + name);
    }
}
   class B extends A{
       public B(){
           System.out.println("子类的无参");
       }
       public B(String name){
           System.out.println("子类的有参:"+name);
       }
       public B(Integer age){
           System.out.println("有参私有构造");
       }
   }

   ·getDeclaredConstructors()  --获得所有的访问权限的构造函数

Class<?> aClass = Class.forName("FanSe1.B");
//得到类对象 -- 调用构造函数
Object o = aClass.newInstance();
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
    System.out.println(declaredConstructor);
}

   ·getConstructors  --只能获得public修饰的构造函数

Constructor<?>[] constructors = aClass.getConstructors();
for (Constructor<?> constructor : constructors) {
    System.out.println(constructor);
}

 9、Constructor类中常用的方法

构造函数:

class A {
    public A() {
        System.out.println("父类的无参构造函数");
    }

    public A(String name) {
        System.out.println("这是父类的有参构造函数:" + name);
    }
}
   class B extends A{
       public B(){
           System.out.println("子类的无参");
       }
       public B(String name){
           System.out.println("子类的有参:"+name);
       }
       private B(Integer age,String name){
           System.out.println("有参私有构造age:"+age+"有参私有构造name:"+name);
       }
   }

   ·getDeclaredConstructor(属性.class,.....)  --用于获取某个类的指定构造方法,返回一个Constructor对象,表示指定的构造方法

Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(Integer.class,String.class);
declaredConstructor1.setAccessible(true);
Object helloWorid = declaredConstructor1.newInstance(18,"hello worid");

 

 

 

标签:反射,name,age,System,println,public,out
From: https://www.cnblogs.com/PHOEDE/p/17622181.html

相关文章

  • java反射
    1.回顾泛型:[泛型类,泛型接口,泛型方法]publicclass类名<泛型标志...>{​//使用泛型标志定义数据类型}publicinterface接口<泛型标志>{​//使用泛型标志定义抽象方法}publicclass类名implements接口<泛型类型>{}publicclass类名<泛型标志>imp......
  • java高级之反射
    1.理解反射:【其就是在运行时,它是把类中成员抽取为其他类对象的过程】2.获取反射Class的三种方式:【获取之前首先要创建一个类对象,这里就叫做xw.Class】其一:通过Class.forName的方式获取:及Class<?>aClass=Class.forName("com.ssm.entity.fanshe.xw");其二:通过类名.cl......
  • .net的反射机制
    学习4点:1.反射有什么用,什么情况下用反射。         (参考资料http://dotnet.9sssd.com/csbase/art/733)2.通过简单的例子理解反射的运用。          (参考资料http://www.2cto.com/kf/201110/109636.html)3.通过复杂的例子理解更多反射的用法,......
  • Java Reflection机制 实现类的反射与动态调用
    JavaReflection机制实现类的反射与动态调用JavaReflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。JavaReflection机制实现类的反射与动态调用JavaRefle......
  • 反射中setAccessIble(true)有什么作用?
    结论动态修改一个类的方法或属性或执行方法都要受安全体系的检查,而安全体系处理是非常消耗资源的。因此运行期间想要动态修改类信息时提供了一个Accessible方法,其作用是是否逃避java安全体系的检查,进行快速访问。相比不进行设置setAccessible=true的操作,性能消耗大概是20倍左右......
  • 使用反射管理参数配置
    在C#中,反射是一种强大的机制,它允许我们在运行时检查和操作类型的成员,包括属性和字段。利用反射,我们可以实现参数的灵活配置和管理。本篇博客将详细介绍如何使用反射来管理参数配置,并提供一个帮助类的代码示例。创建参数配置类首先,我们需要创建一个参数配置类,该类将包含我们希望......
  • C#反射
    C#中的反射:通俗易懂详解反射是C#中一种强大的编程技术,它允许我们在运行时获取和操作类型的信息。通过反射,我们可以在不知道类型的完整信息的情况下,动态地创建对象、调用方法和访问属性。本文将深入介绍C#中反射的知识点,并提供简单易懂的示例和代码。1.引入命名空间首先,在使用......
  • 什么是猴子补丁,有什么用途,什么是反射,python中如何使用反射,http和https的区别
    1什么是猴子补丁,有什么用途猴子补丁:动态修改或扩展代码的技术,通在不修改源代码的情况下,改变代码的执行方式或增加功能 -MonkeyPatching是在运行时(runtime)动态替换属性(attributes)或方法 -Python的类是可变的(mutable),方法(methods)只是类的属性(attributes);这允许我......
  • Java反射与自定义注解实现不同Bean属性映射的高效解决方案
    假设现有一个叫user的bean,里面有username、passsword、sex、createTime这四个属性,需要实现一个功能,把其它bean里的字段分别映射到user里的username、passsword、sex、createTime这几个属性上,然后可以根据其它的bean的实例自动转化为user的实例(填充对应属性值),下面是代码实现。Java......
  • Golang反射type和kind有什么区
    一、前言Go语言中的反射是由reflect包提供支持的,它定义了两个重要的类型Type和Value。任意值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。在Go语......