前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java---反射(重点)

java---反射(重点)

作者头像
用户10787181
发布2023-10-17 09:09:03
1790
发布2023-10-17 09:09:03
举报
文章被收录于专栏:小龙学编程

类似于自己照镜子,镜子中有自己的投影。就是像一个类在照镜子,通过一个对象,一个类名,这个类内部的结构就能清晰的看出来。反射有一个类Class类 ,小写class是在定义类。大写Class是一个类。反射类,可以通过反射类的对象去获取一个类中的所有属性,方法,注解,构造,父类 ,接口.....所有东西,无论公共还是私有。反射在框架中会大量使用,这里是一个重点。

Class类 对象 代表是具体要去映射哪个类。

20.1 创建对象

1、对象名.getClass();

2、类名.class;

3、Class.forName("完全限定名") 完全限定名(全类名): com.qf.entitys.Student

代码语言:javascript
复制
Class c1= Student.class;

Student stu=new Student();
Class c2=stu.getClass();

try {
    Class c3=Class.forName("com.qf.lambdaDemo.Student");
} catch (ClassNotFoundException e) {
   e.printStackTrace();
}

使用Class对象获取反射类型的类名

代码语言:javascript
复制
public class ClassDemo {
    public static void main(String[] args) {

        Student stu=new Student();
        Class c2=stu.getClass();
        //类名
        System.out.println(c2.getSimpleName());
        //全类名
        System.out.println(c2.getName());

    }
}

Field 类 反射技术中用于描述属性

代码语言:javascript
复制
package com.qf;

import com.qf.lambdaDemo.Student;

import java.lang.reflect.Field;

public class ClassDemo {
    public static void main(String[] args) {
        Student stu=new Student(1,"张鹏","男","13312345678","重庆市沙坪坝区",3.14);
        Class c2=stu.getClass();
        System.out.println(c2.getSimpleName());
        System.out.println(c2.getName());

        Field[] declaredFields = c2.getDeclaredFields();
        for (Field f: declaredFields){
            f.setAccessible(true); //不进行私有安全检查
            System.out.println(f.getName());
            try {
                System.out.println(f.get(stu));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}

c.getField("属性名"); 根据属性名获取单个公共的属性

c.getFields(); 获取指定类所有的公共的属性

c.getDeclaredField("属性名"); 根据属性名获取属性,无视访问修饰符

c.getDeclaredFields(); 获取指定类所有的属性

这些方法的返回值是Field类型获取个就是一个对象,多个就是Field[]数组。

20.2 Field类

getName() 获取属性名

get(target) 获取属性值 target哪个对象中的属性值 f.get() 表示获取值,并没有说明要获取哪个对象的这个属性值。

setAccessible(true) /不进行私有安全检查

set(Object,Value); 向指定的对象设置对应的值 orm框架的基础 (实体对象关系映射框架)

代码语言:javascript
复制
import com.qf.entitys.Student;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;


public class Demo1 {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException {

        //ORM框架 关系映射  mybatis -->
        Map<String,Object> map=new HashMap<>();
        map.put("id",1);
        map.put("name","张鹏");
        map.put("sex","男");
        map.put("age",22);
        map.put("phone","13388889999");
        map.put("address","重庆市江北区");


        Class c = Student.class;
        //根据反射对象创建被反射类的对象
        Object o = c.newInstance();//没有值的对象
        for (String key:map.keySet()) {
            Field f = c.getDeclaredField(key);
            f.setAccessible(true);
            //set(o,)设置属性值
            f.set(o,map.get(key));
        }

        System.out.println(o.toString());

    }
}

20.3 Method

c.getMethod("属性名"); 根据属性名获取单个公共的方法

c.getMethods(); 获取指定类所有的公共的方法

c.getDeclaredMethod("属性名"); 根据属性名获取方法,无视访问修饰符

c.getDeclaredMethods(); 获取指定类所有的方法

代码语言:javascript
复制
public class Demo3 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class c = Class.forName("com.qf.entitys.Student");
        Object o = c.newInstance();
        Method[] methods = c.getMethods();
        //查看这个类中所有的公共方法
        for (Method m: methods) {
            System.out.println(m.getName());
          
        }
    }
}

Object invoke(target,Object...args)

invoke代表执行这个方法,需要指明由哪个对象去执行,方法的参数是什么(方法的参数要和执行的方法的参数位置,类型一致),如果没有参数invoke方法的第二个参数就写null。返回值是执行目标方法的返回结果,如果目标方法没有返回结果(void) 返回值是一个null。

getMethod(methodName,Class...params);

获取指定名称的方法,第一个参数是名称,第二个参数是目标方法参数的类型,如果目标方法没有参数,可以直接getMethod("show"),如果目标方法有参数,getMethod("show",参数类型.class ...);第二个参数个数,位置也要一一对应。

代码语言:javascript
复制
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

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

        Class c = Class.forName("com.qf.entitys.Student");
        Object o = c.newInstance();
      
        Method show1 = c.getMethod("show");
        Method show2 = c.getMethod("show",Integer.class);
        Method show3 = c.getMethod("show",Integer.class,Integer.class);
        Method show4 = c.getMethod("show",String.class,Double.class);
        show1.invoke(o,null);
        show2.invoke(o,1);
        Object result= show3.invoke(o,2,5);
        System.out.println(result);

        Object obj = show4.invoke("你好", 3.14);
        System.out.println(obj);
    }
}

Object o = c.newInstance(); //反射的是什么类,创建的就是那个类的对象,这是一个没有数据的对象相当于

Student o=new Student();

20.4 Constructor

用于表示构造方法

代码语言:javascript
复制
public class Demo4 {
    public static void main(String[] args) {
        Class c = Student.class;
        Constructor[] constructors = c.getConstructors();
        for (Constructor ct : constructors){
            System.out.println(ct.getName());
        }
    }
}

单独获取

调用无参构造,并将数据源中的值,赋值给创建的对象

代码语言:javascript
复制
public class Demo4 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class c = Student.class;
        //c.getConstructor()获取的无参构造
        Constructor constructor = c.getConstructor();
        //这一步调用无参构造  Class.newInstance() 这两种本质是一样的
        Object o = constructor.newInstance();

        Map<String,Object> map=new HashMap<>();
        map.put("id",1);
        map.put("name","张鹏");
        map.put("sex","男");
        map.put("age",22);
        map.put("phone","13388889999");
        map.put("address","重庆市江北区");
        for (String key:map.keySet()) {
            Field f = c.getDeclaredField(key);
            f.setAccessible(true);
            f.set(o,map.get(key));
        }

        System.out.println(o.toString());

    }
}

调用有参构造:

代码语言:javascript
复制
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


public class Demo4 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class c = Student.class;
        //c.getConstructor()获取的无参构造
        Constructor constructor = c.getConstructor(Integer.class,String.class,String.class,Integer.class,String.class,String.class);
        Object o = constructor.newInstance(2, "谢灵儿", "女", 20, "13355556666", "重庆市");
        System.out.println(o);
    }
}

20.5 Package

代码语言:javascript
复制
public class Demo5 {
    public static void main(String[] args) {
        Class c = Student.class;
        Package aPackage = c.getPackage();
        System.out.println(aPackage.getName());
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 20.1 创建对象
  • 20.2 Field类
  • 20.3 Method
  • 20.4 Constructor
  • 20.5 Package
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档