美文网首页
关于反射

关于反射

作者: 一只小星_ | 来源:发表于2022-04-17 21:29 被阅读0次

1. 三种获取类对象的方式

三种获取类对象的方式,内存中一个类只会有一个class对象。

    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射来获取对象的方式,包名+类名
        //内存中一个类只会有一个class对象
        Class s1 = Class.forName("study.TestSort");
        Class s2 = TestSort.class;
        TestSort testSort = new TestSort();
        Class s3 = testSort.getClass();

        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
    }

2.哪些类有Class 对象?

  • class
  • 接口
  • []数组
  • enum 枚举
  • annotation 注解
  • 基本数据类型
  • void

3. 类的执行顺序:

首先是类的内容:静态变量、静态初始化块
再是 实例内容:变量、初始化块、构造器

4.什么时候会发生类的初始化?

类分为主动引用和被动引用。主动引用会发生类的初始化,被动引用不会。
被动引用

//引用类的常量不会发生初始化,常量通常在链接阶段就存入调用类的常量池中了
public class ReflectTest {
    static {
        System.out.println("Main类被加载");
    }

    public static void main(String[] args) {
        System.out.println(Son.M);
    }
}

class Father{
    static int b = 2;
    static {
        System.out.println("父类被加载");
    }
}

class Son extends Father{
    static {
        System.out.println("子类被加载");
        m = 300;
    }
    static int m = 100;
    static final int M = 1;
}

输出
Main类被加载
1

M被final修饰,不需要去初始化,在链接阶段就存在了。

需要初始化的时候:
当虚拟机启动,会先初始化main方法所在的类。
当new一个对象时。
调用类的静态成员(除了final)和静态方法也会初始化。
对类进行反射调用。

 public static void main(String[] args) {
        System.out.println(Son.m);
    }

前面例子里,打印这个
输出
Main类被加载
父类被加载
子类被加载
100

5.通过反射获取类的参数

public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class c1 = User.class;
        //调用无参构造函数
        //User user = (User) c1.newInstance();
        //用构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor();
        User user = (User) constructor.newInstance();
        //获取setName方法,如果setname方法是private,是无法invoke的,必须要setAccessible(true)
        Method setNameMethod = c1.getDeclaredMethod("setName", String.class);
        setNameMethod.setAccessible(true);
        setNameMethod.invoke(user,"mmm");
        System.out.println(user.getName());
    }

对象关系映射

ORM 对象和表结构对象

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class s1 = Class.forName("reflect.Student");
        //通过反射获得value的值
        Table table = (Table) s1.getAnnotation(Table.class);
        String value = table.value();
        System.out.println(value);

        java.lang.reflect.Field field = s1.getDeclaredField("name");
        Field fieldAnnotation = field.getAnnotation(Field.class);
        System.out.println(fieldAnnotation.columnName());
    }
}

@Table("db_student")
class Student{
    @Field(columnName = "name", type = "varchar")
    private String name;
    @Field(columnName = "type", type = "int")
    private int age;
}

//放在class上
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
    String value();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Field{
    String columnName();
    String type();
}

相关文章

  • 关于反射

    反射原理 “任何类的对象都是Class类的对象”! 在Java中,每个class都有一个相应的Class对象。也...

  • 关于反射

  • 关于反射

    Golang的反射reflect深入理解和示例 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够...

  • 关于反射

    文章参考来源:https://www.cnblogs.com/wangshenhe/p/3256657.html ...

  • 关于反射

    1. 三种获取类对象的方式 三种获取类对象的方式,内存中一个类只会有一个class对象。 2.哪些类有Class ...

  • 关于java反射

    //getDeclaredMethods 返回当前类定义的所有方法 (Field同理) //getMethod...

  • 关于Java反射

    记 java.lang.IllegalArgumentException: object is not an in...

  • 关于反射效应

    “处于收益状态时,因为“确定效应”,人们更加厌恶风险,喜欢“见好就收”;处于损失状态时,因为“反射效应”,人们更加...

  • 关于反射机制

    个人理解反射机制就是可以通过字符串动态编译类、调用方法。但是,调用类时必须知道类名,调用方法时方法的签名必须提前形...

  • 关于Java反射

    关于Class 类加载的几种方式 new Xxx() classLoader.loadClass(String c...

网友评论

      本文标题:关于反射

      本文链接:https://www.haomeiwen.com/subject/ahvlertx.html