Java反射

目录:

1.什么是反射

2.获取Class反射类的方式

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

4.通过反射类获取属性类对象

    4.1Field  (属性)  类中常见的方法

5.获取方法类对象

     5.1Method(方法)类中常见的方法

6.获取Constructor(构造)对象

 技术细节:

1.什么是反射

反射它是框架设计的灵魂。

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

2.获取Class反射类的方式

获取Class反射类有三种方式:

第一种:Class.forName("类的全路径")

<bean id="s" class="com.aaa.Student">
app.getBean("s");

第二种: 类.class

Mybatis----session.getMapper(StudentDao.class)

第三种: 对象名.getClass();

代码演示:

package demo01;
//获取Class反射类有三种方式:
public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种,通过路径获取
        Class <?> aClass = Class.forName("demo01.Student");
        //第二种.通过类名获取
        Class<Student> aClass1 = Student.class;
        //第三种,通过对象获取
        Student s = new Student();
        Class<? extends Student> aClass2 = s.getClass();
        //这三个对象的引用地址相同
        System.out.println(aClass==aClass1);
        System.out.println(aClass==aClass2);
        System.out.println(aClass1==aClass2);
    }
}
class Student{
String name;
private String sex;
public  String address;
public void  show(){
    System.out.println("!!!!!!!!!!!show!!!!!!!!");
}
}

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

语法:

反射对象.newInstance();

代码演示:

package demo02;
//通过反射获取反射类对象
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {


        //获取反射类
        Class<Student> aClass1 = Student.class;
        //获取反射类对象   o和o1的地址不相同
        Student o = aClass1.newInstance();
        Student o1 = aClass1.newInstance();
        System.out.println(o);
        System.out.println(o1);


    }
}
class Student{
String name;
private String sex;
public  String address;

    public Student() {
    }

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

    public void  show(){
    System.out.println("!!!!!!!!!!!show!!!!!!!!");
}

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return sex
     */
    public String getSex() {
        return sex;
    }

    /**
     * 设置
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

    /**
     * 获取
     * @return address
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return "Student{name = " + name + ", sex = " + sex + ", address = " + address + "}";
    }
}

4.通过反射类获取属性类对象

代码演示:

package demo03;

import java.lang.reflect.Field;

//通过反射获取反射类对象
public class Test {
    public static void main(String[] args) throws Exception {
        //获取反射类对象
        Class<Student> aClass = Student.class;
        //通过反射类对象获取本类中指定(指定sex)的属性对象;他获取不了父类中的属性对象
        Field sexField = aClass.getDeclaredField("sex");
        System.out.println(sexField);
        //获取本类中的所有属性对象
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field f : declaredFields){
            System.out.println(f);
        }
        //获取本类或父类中所有public属性对象
        //一起拿
        Field[] fields = aClass.getFields();
        for (Field f : fields){
            System.out.println(f);
        }
        //单个拿
        Field address = aClass.getField("address");
        System.out.println(address);
        Field phone = aClass.getField("phone");
        System.out.println(phone);

    }
}
class People{
    public String phone;
}
class Student extends People{
String name;
private String sex;
public  String address;

    public Student() {
    }

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

    public void  show(){
    System.out.println("!!!!!!!!!!!show!!!!!!!!");
}

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return sex
     */
    public String getSex() {
        return sex;
    }

    /**
     * 设置
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

    /**
     * 获取
     * @return address
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return "Student{name = " + name + ", sex = " + sex + ", address = " + address + "}";
    }
}

4.1Field(属性)类中常见的方法

 语法:

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

set(o,value);

代码演示:

package demo04;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取反射类
        Class<Son> sonClass = Son.class;

        //获取反射类中的属性对象
        Field nameField = sonClass.getDeclaredField("name");
        //获取属性对象的修饰符;返回值是int类型。对应修饰符的值
        int modifiers = nameField.getModifiers();
        System.out.println(modifiers);


        //获取反射类对象
        Son son = sonClass.newInstance();
        //打印结果反射类对象的属性没有值
        System.out.println(son);
        //因为属性nameField属性对象,对应的属性name是私有的,所以用反射打破封装性
        nameField.setAccessible(true);
        //给son中的nameField 属性赋值
        nameField.set(son,"刘德华");//name 参数类型是String所以加引号
        System.out.println(son);
    }
}
class Son{
    private String name;
    public int age;

    public Son() {
    }

    public Son(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Son{name = " + name + ", age = " + age + "}";
    }
}

5.获取方法类对象

getMethods():获取本类以及父类中所有public的方法对象

getMethod(name,Class...):根据方法名获取对应的方法对象

getDeclaredMethods();得到本类中所有方法对象

getDeclaredMethod(name,Class 参数的类型)

5.1Method(方法)类中常见的方法

语法:

*Object invoke(Object o,Object... values)

* Object o = show.invoke(son, 18, "hello");//执行该方法
 System.out.println(o);

5跟5.1合并代码演示:

package demo05;


import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取反射类
        Class<Son> sonClass = Son.class;
        //获取反射类对象
        Son son = sonClass.newInstance();
        //根据方法名获取方法对象;int.class为参数;为什么要写.class因为底层要的是class类型
        Method show = sonClass.getMethod("show",int.class);
        //执行son类对象的show方法;18为int.class参数赋值为18
        show.invoke(son,18);

    }
}
class Son{

public void show(int a){
    System.out.println("~~~~~~show~~~~~~~~"+ a);
}

}

6.获取Constructor(构造)对象

代码演示:

package demo06;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws Exception {
        //获取反射类
        Class<?> aClass = Class.forName("demo06.Son");
        //不传参数,获取的是无参构造方法对象
        Constructor<?> constructor = aClass.getConstructor();
        //通过无参构造对象获取son对象(也叫实例对象)
        Object o = constructor.newInstance();
        System.out.println(o);
        //获取有参的构造对象
        Constructor<?> constructor1 = aClass.getConstructor(String.class, int.class);
        //通过有参构造对象获取son对象
        Object o1 = constructor1.newInstance("张三", 18);
        System.out.println(o1);

    }
}
class Son{
    private String name;
    public int age;

    public void show(int a){
        System.out.println("~~~~~~show~~~~~~~~"+ a);
    }

    public Son() {
    }
    public Son(String name) {
        this.name = name;

    }
    public Son(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "Son{name = " + name + ", age = " + age + "}";
    }
}

总结:

反射: [1]获取反射类的方式 [2]获取属性对象Field [3]获取方法对象 [4]构造对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值