IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 大数据进阶28-反射 -> 正文阅读

[大数据]大数据进阶28-反射

这一块的内容主要是有关Java中反射的内容。

反射

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

简言化之:
反射就是:通过class文件对象去使用该文件中的成员变量,构造方法,成员方法

之前我们写了很多类Java文件,再去实例化的时候,直接new出来
比如:Person p = new Person();

总归还是需要一个class文件
也就是需要得到class文件对象,其实也就是获得该class类的对象

class类:
成员变量:Field
构造方法:Constructor
成员方法:Method

如何获取class文件对象
1、通过Object中的getClass()方法返回此Object的运行时的类
2、数据类型的静态属性class
3、class类中的静态方法
static Class<?> forName(String className)
返回与给定字符串名称的类或接口相关联的 类对象。

我们应该使用哪一种
1、如果是我们自己学习或者自己写一些案例,哪一种都可以,第二种比较方便
2、开发中,使用第三种
因为第三种传入的是一个字符串,而不是一个具体的类型
之后,会通过配置文件传入,比较方便

三种方式获取class文件对象

public static void main(String[] args) throws ClassNotFoundException {
        //方式一   通过Object中的getClass()方法  返回此Object运行时的类
        Person p1 = new Person();
        Class<? extends Person> c1 = p1.getClass();
        Person p2 = new Person();
        Class<? extends Person> c2 = p2.getClass();
        System.out.println(p1==p2);//false
        System.out.println(c1==c2);//true

        //方式二   静态类型的静态属性class
        Class<Person> pc = Person.class;
        System.out.println(c1==pc);//true
        System.out.println(c2==pc);//true

        //方式三   Class类中的静态方法
        //注意:需要写上完整的路径
        Class<?> c3 = Class.forName("com.bigdata.shujia27.Person");
        System.out.println(c1==c3);//true
    }

通过反射获取class文件对象中的无参构造方法并使用

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取class文件对象
        Class<?> c = Class.forName("com.bigdata.shujia27.Person");

        //获取公共的构造方法
        Constructor<?>[] cons = c.getConstructors();
        for(Constructor con:cons){
            System.out.println(con);
        }
        System.out.println("**********************");

        //获取所有的构造方法
        Constructor<?>[] decons = c.getDeclaredConstructors();
        for(Constructor decon:decons){
            System.out.println(decon);
        }
        System.out.println("**********************");

        //获取单个构造方法
        Constructor<T> getConstructor(Class<?>... parameterTypes)
        Constructor<?> con = c.getConstructor();//返回的是无参构造
        System.out.println(con);
        System.out.println("**********************");

        //获取构造方法的目的是创建对象
        Object obj = con.newInstance();
        System.out.println(obj);
        Person p = (Person) obj;
        System.out.println(p);
    }
    //public com.bigdata.shujia27.Person(java.lang.String,int,java.lang.String)
    //public com.bigdata.shujia27.Person()
    //**********************
    //public com.bigdata.shujia27.Person(java.lang.String,int,java.lang.String)
    //private com.bigdata.shujia27.Person(java.lang.String,int)
    //private com.bigdata.shujia27.Person(java.lang.String)
    //public com.bigdata.shujia27.Person()
    //**********************
    //public com.bigdata.shujia27.Person()
    //**********************
    //Person{name='null', age=0, address='null'}
    //Person{name='null', age=0, address='null'}

通过反射获取class文件对象中的带参构造方法并使用

//反射获取带参构造方法并使用
public class ReflexDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> c = Class.forName("com.bigdata.shujia27.Person");

        //getConstructor    获取的是公共的构造方法
        //getDeclaredConstructor    获取的是私有的构造方法
        Constructor<?> con = c.getConstructor(String.class, int.class, String.class);

        //通过带参的构造方法创建对象
        Object obj = con.newInstance("zhangsan", 21, "zhangsanjia");
        //如果出现这个错误:IllegalAccessException :非法的访问异常
        //就需要添加一步
        //暴力访问
        con.setAccessible(true);
        System.out.println(obj);
    }
}
//Person{name='zhangsan', age=21, address='zhangsanjia'}

通过反射获取class文件对象中的成员变量并使用

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class<?> c = Class.forName("com.bigdata.shujia27.Person");

        //getFields
        //获取所有的可访问的     公共      字段成员变量
        Field[] fields = c.getFields();
        for(Field field : fields){
            System.out.println(field);
        }
        System.out.println("********************");

        //getDeclaredFields
        //获取所有成员变量,包括   私有、默认、protected
        Field[] defields = c.getDeclaredFields();
        for(Field defield:defields){
            System.out.println(defield);
        }
        System.out.println("********************");



        //通过反射创建对象,并给对象赋值
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
        System.out.println(obj);
        Field address = c.getField("address");
        Field age = c.getDeclaredField("age");
        Field name = c.getDeclaredField("name");
        address.set(obj,"合肥");
        age.setAccessible(true);
        age.set(obj,21);
        name.setAccessible(true);
        name.set(obj,"zhangsna");

        System.out.println(obj);//Person{name='zhangsna', age=21, address='合肥'}
    }

通过反射获取class文件对象中的成员方法并使用

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> c = Class.forName("com.bigdata.shujia27.Person");

        //getMethods()  获取所有公共的方法(自己的和父类的)
        Method[] methods = c.getMethods();
        for(Method method : methods){
            System.out.println(method);
        }
        System.out.println("***********************");

        //getDeclaredMethods()  获取自己所有的方法,包括私有的
        Method[] demethods = c.getDeclaredMethods();
        for(Method demethod : demethods){
            System.out.println(demethod);
        }
        System.out.println("***********************");

        //获取单个方法
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();
        Method show = c.getMethod("show");//没有小括号
        System.out.println(show);
        //Object invoke(Object obj, Object... args)
        //第一个参数是调用方法上的对象,第二个参数是这个方法需要传入的参数
        Object o1 = show.invoke(obj);//调用obj对象的show方法
        System.out.println(o1);
        System.out.println("***********************");

        Method getString = c.getMethod("getString", String.class, int.class);
        Object o2 = getString.invoke(obj, "zhangsan", 21);
        System.out.println(o2);
        System.out.println("***********************");

        Method fun = c.getDeclaredMethod("fun");
        fun.setAccessible(true);
        fun.invoke(obj);
    }
    //public java.lang.String com.bigdata.shujia27.Person.toString()
    //public void com.bigdata.shujia27.Person.show()
    //public java.lang.String com.bigdata.shujia27.Person.getString(java.lang.String,int)
    //public final void java.lang.Object.wait() throws java.lang.InterruptedException
    //public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    //public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    //public boolean java.lang.Object.equals(java.lang.Object)
    //public native int java.lang.Object.hashCode()
    //public final native java.lang.Class java.lang.Object.getClass()
    //public final native void java.lang.Object.notify()
    //public final native void java.lang.Object.notifyAll()
    //***********************
    //public java.lang.String com.bigdata.shujia27.Person.toString()
    //public void com.bigdata.shujia27.Person.show()
    //private void com.bigdata.shujia27.Person.fun()
    //public java.lang.String com.bigdata.shujia27.Person.getString(java.lang.String,int)
    //***********************
    //public void com.bigdata.shujia27.Person.show()
    //这是公共的show方法
    //null
    //***********************
    //zhangsan---21
    //***********************
    //这是私有的fun方法

通过配置文件来操作对象

配置文件:configure.txt
className=com.bigdata.shujia27.Person
methodName=study

public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        FileReader fr = new FileReader("D:\\BigDaTa\\JavaProject\\src\\com\\bigdata\\shujia27\\configure.txt");
        prop.load(fr);
        fr.close();

        //获取数据
        String className = prop.getProperty("className");
        System.out.println(className);
        String methodName = prop.getProperty("methodName");
        System.out.println(methodName);

        Class<?> c = Class.forName(className);
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

        //通过反射调用方法
        Method method = c.getMethod(methodName);
        method.invoke(obj);
    }

给一个ArrayList的对象,想在这个集合中添加一个字符串数据,如何实现

public class ArrayListDemo {
    public static void main(String[] args) throws Exception{
        ArrayList<Integer> list = new ArrayList<Integer>();

        list.add(12);
        list.add(34);
        list.add(56);

        //反射去实现
        Class<? extends ArrayList> c = list.getClass();
        Method add = c.getMethod("add", Object.class);
        add.invoke(list,"hello");
        add.invoke(list,"world");
        add.invoke(list,12);

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            Object next = (Object)iterator.next();
            System.out.println(next);
        }
    }
}
//12
//34
//56
//hello
//world
//12

感谢阅读,我是啊帅和和,一位大数据专业即将大四学生,祝你快乐。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:55:47  更:2021-08-27 11:56:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/18 16:48:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码