其他分享
首页 > 其他分享> > 反射简介及简单案例

反射简介及简单案例

作者:互联网

反射概述:反射是框架的灵魂!

1.1 JAVA反射机制

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

​ 可以拿到类的字节码对象,通过字节码对象拿到这个类中所有的信息。

​ (类的信息:类名,包名,属性,构造方法,普通方法,继承来的方法)

​ p = new People();

​ ApplocationContext context = new ClassPathXmlApplocationContext(“bean.xml”);

​ context.getBean(“id”); context.getBean(People.class); context.getBean(“id”,People.class);

思考:

1. 类的字节码对象如何拿到?
2. 如何通过字节码对象获取类中的信息?
3. 如何使用获取到的对象中的信息?

此时就需要使用到反射了!!!

步骤:

1. 拿到类的字节码对象
2.取出类中信息
3. 使用类的信息

1.2 反射的使用

​ Java反射机制获取类的信息 其实就是获取类的字节码文件的内容,并将这些内容封装到一个字节码对象中,所以我们只需要使用反射的代码获取字节码对象,就能拿到类的信息了。

1.2.1 Class类简介

​ Class代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。

方法名含义
getMethod(String name, Class<?>… parameterTypes)获得该类某个公有的方法
getMethods()获得该类所有公有的方法
getDeclaredMethod(String name, Class<?>… parameterTypes)获得该类某个方法
getDeclaredMethods()获得该类所有方法

1.2.2 获取类的字节码对象—三种方式

public static void main(String[] args) throws Exception {
        //三种方式
        //1.Class.forName("全类名");  获取  类的字节码对象  通过类路径
        Class pClass1 = Class.forName("com.aaa.reflex.demo1.People");
        System.out.println(pClass1);

        //2.类名.class
        Class pClass2 = People.class;
        System.out.println(pClass2);

        //3.通过  对象.getClass();
        People people = new People();
        Class pClass3 = people.getClass();
        System.out.println(pClass3);

        System.out.println(pClass1 == pClass2);
        System.out.println(pClass1 == pClass3);
    }

**注意:**三种方式获取的类的字节码对象是相同的。

1.2.3 根据类的字节码对象获取类的信息,并使用。

1.2.4 反射案例

(1)创建一个自定义注解(用于获取注解属性的属性值)
//规定注解的使用范围
@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldName {
    String value();
}

(2)创建一个实体类,添加注解
@TableName("book")
public class Book {
    @FieldName("bookid")
    private Integer id;
    @FieldName("bookname")
    private String bookname;
    @FieldName("typeid")
    private Integer typeid;
    @FieldName("author")
    private String author;
}
(3)使用反射机制获取Book对象,并将其属性拼接成一条aql查询语句
public class SelectSql {

    /**
     * 主函数
     * */
    public static void main(String[] args) throws Exception{
        //获取book的查询语句
        String sql = getSql(Book.class);
        System.out.println(sql);


    }

    /**
     * 自定义一个静态方法用于获取查询语句的方法,,传入需要获取的实体类的字节码
     * */
    public static String getSql(Class c){
        //1.获取实体类的字节码对象
        Class bookClass = c;
        //Class<?> bookClass = Class.forName("com.aaa.reflex.demo2.User");

        //2.提取实体类中的注解信息
            //2.1 提取表名
            TableName tableName =(TableName) bookClass.getAnnotation(TableName.class);
            System.out.println(tableName.value());
            //2.2 提取字段名
            Field[] fields = bookClass.getDeclaredFields();
            //System.out.println(Arrays.toString(fields));

            //创建一个列表用来存所有字段名
            ArrayList<String> strings = new ArrayList<>();
            for (int i = 0; i < fields.length; i++) {
                FieldName fieldName = fields[i].getAnnotation(FieldName.class);
                strings.add(fieldName.value());
            }
            System.out.println(strings);

        //3.将取出的表名和字段名 处理 成我们需要的sql语句
        StringBuffer sql = new StringBuffer("select ");
        for (int i = 0; i < strings.size(); i++) {
            if(i<strings.size()-1){
                sql.append(strings.get(i)+",");
            }else{
                sql.append(strings.get(i)+" ");
            }
        }
        sql.append("from "+tableName.value());
        //System.out.println(sql);
        return sql.toString();
    }
}
(4)运行结果:

在这里插入图片描述

标签:反射,获取,简介,System,pClass,案例,println,class,out
来源: https://blog.csdn.net/qq_48445961/article/details/116258706