Java基础之—反射

目录

1.什么是反射?

2.获取Class反射类的方式

3.通过反射类获取对应的类对象

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

4.1获取反射类中的属性类对象

4.2Field类中常见的方法

5. 获取方法类对象

5.1获取方法类对象

 5.2Method类中常见的方法

6.获取Constructor对象 

6.1获取Constructor对象

6.2Constructor类中常用的方法


1.什么是反射?

反射:是框架设计的灵魂。它就是把类中成员封装到其他类对象的形式。在通过该类对象可以获取成员的信息。

框架: 它就是一个半成品,客户可以引入该框架,在框架的基础上填写自己的业务代码。提高开发效率。 比如: springmvc mybatis框架 。

2.获取Class反射类的方式

 获取CLass反射类共有三种方式:

  1. Class.forName("类的全路径")
  2. 类.class
  3.  对象名.getClass();​​​​​​

package com.aaa.demo08;
public class Test08 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //第一种方法:Class.forName("类的全路径")
        Class<?> aClass1 = Class.forName("com.aaa.demo08.Student");
        //第二种方法:类.class
        Class<Student> aClass2 = Student.class;
        //第三种方法:对象名.getClass()
        Student student = new Student();
        Class<? extends Student> aClass3 = student.getClass();
        Class<? extends Student> aClass4 = student.getClass();

        //判断这三个对象的引用地址是否相同
        System.out.println(aClass1);
        System.out.println(aClass1==aClass2);
        System.out.println(aClass1==aClass3);
        System.out.println(aClass2==aClass3);
        //System.out.println(aClass4==aClass3);

    }
}



package com.aaa.demo08;
public class Student {
    private String name;
    private Integer age;
    private String address;
    public void show(){
        System.out.println("hello");
    }
    public Student() {
    }
    public Student(String name, Integer age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    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 String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

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

3.通过反射类获取对应的类对象

反射类调用newInstance();

public class Test02 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Class<Student> studentClass = Student.class;
        Student student = studentClass.newInstance();
        Student student1 = studentClass.newInstance();
        System.out.println(student);
        System.out.println(student1);
        System.out.println(student==student1);

        Class<Student> aClass = (Class<Student>) Class.forName("com.aaa.demo01.Student");
        Student student2 = aClass.newInstance();

        Student student3 = new Student();
        Class<? extends Student> aClass1 = student3.getClass();
        Student student4 = aClass1.newInstance();
        System.out.println(student3);
        System.out.println(student4);
    }
}

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

4.1获取反射类中的属性类对象

  • getDelaredFields():获取该类中全部属性对象
  • getDelaredField(String name):获取该类中指定名称的属性对象
  • getFields():获取该类和父类中全部public修饰的属性对象
  • getField(String name):获取该类和父类中指定名称的被public修饰的属性对象
package com.aaa.demo02;
import java.lang.reflect.Field;
public class Test002 {
    public static void main(String[] args) throws NoSuchFieldException {
        //获取反射类
        Class<Student> studentClass = Student.class;
        //1.获取该类中全部属性对象
        Field[] declaredFields = studentClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //2.获取该类中指定名称的属性对象
        Field age = studentClass.getDeclaredField("age");
        System.out.println(age);
        //3.获取该类以及父类中被public修饰的属性对象
        Field[] fields = studentClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        //4.获取该类以及父类中指定名称且被public修饰的属性对象
        Field hobby = studentClass.getField("hobby");
        System.out.println(hobby);

    }
}
class People{
    public String hobby;
    private String address;
}
class Student extends People{
    private String name;
    private Integer age;
    public Integer idCard;

    public Student() {
    }

    public Student(String name, Integer age, Integer idCard) {
        this.name = name;
        this.age = age;
        this.idCard = idCard;
    }

    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 Integer getIdCard() {
        return idCard;
    }

    public void setIdCard(Integer idCard) {
        this.idCard = idCard;
    }

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

4.2Field类中常见的方法

setAccessible(true); //设置私有访问权限

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

package com.aaa.demo03;
import java.lang.annotation.*;
import java.lang.reflect.Field;
public class Test03 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class<Teacher> aClass = Teacher.class;
        Teacher teacher = aClass.newInstance();
        System.out.println(teacher);
        Field name = aClass.getDeclaredField("name");
        Field address = aClass.getDeclaredField("address");
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        name.set(teacher,"zkl");
        System.out.println(teacher);
        //允许访问私有属性
        address.setAccessible(true);
        address.set(teacher,"郑州");
        System.out.println(teacher);
        //获取该属性上的指定名称的注解
        My annotation = address.getAnnotation(My.class);
        System.out.println(annotation.value());
    }
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface My{
    String value();
}
class Teacher{
    public String name;
    @My(value = "地址")
    private String address;

    public Teacher() {
    }

    public Teacher(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

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

5. 获取方法类对象

5.1获取方法类对象

getMethods(): //获取本类以及父类中public修饰的方法对象

getMethod(name,Class...):获取本类以及父类中指定名称public修饰的方法对象

getDeclaredMethods():获取本类中所有的Method方法对象

getDeclaredMethod(name,Class 参数的类型):获取本类中指定名称的方法对象

package com.aaa.demo04;
import java.lang.reflect.Method;
public class Test04 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
        Class<Show> showClass = Show.class;
        Show show = showClass.newInstance();
        //1.getMethods():获取本类以及父类中public修饰的方法对象
        Method[] methods = showClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        //2.getMethod(name,Class...):获取本类以及父类中指定名称public修饰的方法对象
        Method hello2 = showClass.getMethod("hello2", String.class);
        System.out.println(hello2);
        //3.getDeclaredMethods():获取本类中所有的Method方法对象
        Method[] declaredMethods = showClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        //4.getDeclaredMethod(name,Class 参数的类型):获取本类中指定名称的方法对象
        Method hello3 = showClass.getDeclaredMethod("hello3");
        System.out.println(hello3);
    }
}
class Show{
    public String hello1(){
        System.out.println("Hello world  01");
        return "======1";
    }
    public String hello2(String name){
        System.out.println("Hello world  01");
        return "======1";
    }
    private String hello3(){
        System.out.println("Hello world  01");
        return "======1";
    }


}

 5.2Method类中常见的方法

invoke(Object o,Object... values): 执行该方法体。

getAnnotation():获取方法上的注解对象

package com.aaa.demo04;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test05 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class<Fun> funClass = Fun.class;
        Fun fun = funClass.newInstance();

        //hello2
        Method hello2 = funClass.getMethod("hello2", String.class, Integer.class);
        //执行该方法体
        Object zkl = hello2.invoke(fun, "zkl", 25);
        System.out.println(zkl);
        //获取该属性的注解对象
        My02 annotation = hello2.getAnnotation(My02.class);
        System.out.println(annotation.value());

        //hello3
        Method hello3 = funClass.getDeclaredMethod("hello3");
        hello3.setAccessible(true);
        Object invoke = hello3.invoke(fun);
        System.out.println(invoke);
    }
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface My02{
    String value();
}
class Fun{
    public String hello1() {
        System.out.println("Hello world  01");
        return "======1";
    }

    @My02("今天是周五")
    public String hello2(String name, Integer age) {
        System.out.println("name:" + name + "  age:" + age);
        return "======1";
    }

    private String hello3() {
        System.out.println("Hello world  01");
        return "======1";
    }
}

6.获取Constructor对象 

6.1获取Constructor对象

getConstructors(): //获取该类所有public构造方法。

getConstructor(Class...params):获取类中指定参数列表的public构造方法。

getDeclaredConstructors():获取该类所有的构造方法。

getDeclaredConstructor(Class...params):获取类中指定参数列表的构造方法。

package com.aaa.demo05;
import java.lang.reflect.Constructor;
public class Test005 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Class<Son> sonClass = Son.class;
        Son son = sonClass.newInstance();
        Constructor<?>[] declaredConstructors = sonClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        Constructor<?>[] constructors = sonClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
    }
}
class Father{
    public Father() {
        System.out.println("父类中的无参构造函数");
    }
    public Father(String name) {
        System.out.println("父类中的无参构造函数");
    }
}
class Son extends Father{
    public Son(){
        System.out.println("子类中的无参构造函数");
    }
    public Son(Integer age){
        System.out.println("子类中的有参构造函数");
    }
    private Son(String name){
        System.out.println("子类中的有参私有构造函数");
    }
}

6.2Constructor类中常用的方法

package com.aaa.demo05;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test005 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

        Class<Son> sonClass = Son.class;
        Constructor<Son> declaredConstructor = sonClass.getDeclaredConstructor(Integer.class);
        Son son = declaredConstructor.newInstance(56);

        Constructor<Son> declaredConstructor1 = sonClass.getDeclaredConstructor(String.class);
        declaredConstructor1.setAccessible(true);
        Son zkl = declaredConstructor1.newInstance("zkl");
    }
}
class Father{
    public Father() {
        System.out.println("父类中的无参构造函数");
    }
    public Father(String name) {
        System.out.println("父类中的无参构造函数");
    }
}
class Son extends Father{
    public Son(){
        System.out.println("子类中的无参构造函数");
    }
    public Son(Integer age){
        System.out.println("子类中的有参构造函数"+age);
    }
    private Son(String name){
        System.out.println("子类中的有参私有构造函数"+name);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值