jdk8 - Java反射代码 求解答,谢谢~

查看:139
本文介绍了jdk8 - Java反射代码 求解答,谢谢~的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

package test;

import java.lang.reflect.Method;

public class JustTest {

    public static void main(String args[]) {
        try {
            // 将编译后的Just.class这个Class对象,指向c{Java中一切皆对象}
            Class<?> c = Just.class;
            // 获取Just这个类中的自定义的方法,包括private、protected、public、默认{c.getMethods()仅包括public方法}
            Method[] m = c.getDeclaredMethods();
            for (Method me : m) {

                // 获取方法名为A的方法名
                if (me.getName().equals("A")) {

                    // 实例化方法,在使用对象之前,先要先加载对应的类
                    Object obj = c.newInstance();
                    // 获取方法,参数为(方法名, Class数组), Class数组中存放着参数的类型
                    Method mm = c.getMethod(me.getName(), new Class[] { java.lang.String.class });
                    // 执行方法的调用,参数为(类的对象,参数数组)
                    mm.invoke(obj, new Object[] { "zxg" });
                }
            }
        } catch (Exception e) {
            // 可能会跑出ClassCastNotFoundation的异常
            e.printStackTrace();
        }
    }
}

class Just {

    public void A(String code) {
        if (code.equals("zxg")) {
            System.out.println("Great!");
        }
    }
}

如上所示的代码,有几点疑惑的求教:

  1. Class和Object之间的关系怎么理解,看了很多解释,还是不明白。
    2.步骤中,Object obj = c.newInstance();这个地方为什么要进行实例化。

求解答,谢谢~

解决方案

我们编写java代码,源文件使用以java为后缀命名,java文件编译后对应的以.class后缀命名;
当java虚拟机记载的时class文件,这些文件在虚拟机中必须以某种数据结构的形式存在,来表示对应的class的各种结构及数据,那么这个结构形式就是Class对象,它是对Class的一种描述
而Object是Class对象实例化的结果,在JVM中Class类对象只会有1份(同一个ClassLoader加载的,放在JVM的固定内存区域中,GC不会对其进行管理),但是可以有不同的多个实例对象存在

一个类的方法必须依赖一个具体的实例才可以被调用(除了静态方法),因为其要依赖具体实例的数据及状态~~~

这篇关于jdk8 - Java反射代码 求解答,谢谢~的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆