反射【了解反射】

文章介绍了Java中的反射机制,包括通过Class.forName(),类.class,对象名.getClass()三种方式获取Class对象。接着展示了如何通过反射创建类实例,访问和修改私有属性,调用方法,以及获取构造器。反射是框架设计的关键,能动态地获取类信息并操作对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、反射

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

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

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

二、获取Class反射类的方式

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

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

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

第二种: 类.class

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

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

public static void main(String[] args) throws ClassNotFoundException {

        //第一种
        Class<?> aClass = Class.forName("org.reflect.demo01.Point");
       // 第二种
        Class<Point> aClass1 = Point.class;
        //第三种
        Point s = new Point();
        Point s2 = new Point();
        Class<? extends Point> aClass2 = s.getClass();
        Class<? extends Point> aClass3 = s2.getClass();


        System.out.println(aClass==aClass1);
        System.out.println(aClass==aClass2);
        System.out.println(aClass1==aClass2);
        System.out.println(aClass3==aClass2);
        
    }

三、 通过反射类获取对应的类对象

反射对象.newInstance();

        Class<Student> aClass1 =Student.class;
        Student o1 = aClass1.newInstance();//通过反射获取对应的类对象
        Student o2 = aClass1.newInstance();//通过反射获取对应的类对象
        System.out.println(o1);
        System.out.println(o2);
        System.out.println(o2==o1);

四、获取属性类对象.

 Class<Student> aClass = Student.class;
//        Field sexField = aClass.getDeclaredField("sex");
//        System.out.println(sexField);
//        Field phone = aClass.getDeclaredField("phone");
//        System.out.println(phone);
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field f:declaredFields){
            System.out.println(f);
        }
        System.out.println("获取本类以及父类中所有public属性对象");
//        Field address = aClass.getField("address");
//        System.out.println(address);
//        Field phone = aClass.getField("phone");
//        System.out.println(phone);
​
        Field[] fields = aClass.getFields();
        for (Field field:fields) {
            System.out.println(field);
        }

1.Field类中常见的方法

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

set(o,value);

        Class<Son> sonClass = Son.class;
        Son son = sonClass.newInstance();
        System.out.println(son);
        Field nameField = sonClass.getDeclaredField("name");
        //IllegalAccessException:
        nameField.setAccessible(true); //设置私有访问权限
        nameField.set(son,"李四"); //为对象son的name属性赋值“李四”
        System.out.println(son);

五、获取方法类对象

getMethods():

getMethod(name,Class...)

getDeclaredMethods();

getDeclaredMethod(name,Class 参数的类型)

Method show = sonClass.getDeclaredMethod("show",Integer.class,String.class);

1.Method类中常见的方法

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

六、获取Constructor对象

package com.demo03;
​
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
​
public class Test03 {
    public static void main(String[] args) throws Exception {
        Class<?> aClass = Class.forName("com.demo03.Son");
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance(); //<bean />
        System.out.println(o);
        Constructor<?> constructor1 = aClass.getConstructor(Object.class, int.class);
        Object instance = constructor1.newInstance("李四", 28);
        System.out.println(instance);
    }
}
​
class Son{
    private String name;//private=2  public=1 default=0 protected=4
    public int age;
    public void show(Integer a,String n){
        System.out.println("~~~~~~~~~~~~~~~~~~show~~~~~~~~~~~~~"+a+";;name="+n);
    }
​
    public Son(String name) {
        this.name = name;
    }
​
    public Son() {
    }
​
    public Son(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Son{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值