精华内容
下载资源
问答
  • 展开全部获取当前线程ClassLoader,通过ClassLoader获取当前工作目录,对目录下文件进行遍历扫描。过滤出62616964757a686964616fe78988e69d8331333433633961以.class...这个方没有考虑不同文件格式。当程序打...

    展开全部

    获取当前线程的ClassLoader,通过ClassLoader获取当前工作目录,对目录下的文件进行遍历扫描。过滤出62616964757a686964616fe78988e69d8331333433633961以.class为后缀的类文件,并加载类到list中,对list中所有类进行校验,判断是否为指定接口的实现类,并排除自身。返回所有符合条件的类。

    这个方没有考虑不同的文件格式。当程序打成jar包,发布运行时,上述的这种遍历file的操作就失效了。只能扫描到当前方法的同级目录及其子目录。无法覆盖整个模块,遍历文件的逻辑太啰嗦,可以简化。

    15da21f095ad7b2f4deb15f2657c0d91.png

    扩展资料:

    Java使用注意事项:

    1、如果没有定义环境变量classpath,java启动jvm后,会在当前目录下查找要运行的类文件。

    2、如果指定了classpath,那么会在指定的目录下查找要运行的类文件。

    3、PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。

    4、需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。

    展开全文
  • 虚拟机的类加载过程

    2019-03-29 09:49:18
    加载的方式,加载的过程,操作对象,最后的结果,执行条件,执行时机,在整个大环境中起到一个怎么样的作用。 加载方式: 1.符号解析时,或者字节码执行的时候会触发其他类的加载 2.通过反射进行加载 3.通过...

    加载的方式,加载的过程,操作对象,最后的结果,执行条件,执行时机,在整个大环境中起到一个怎么样的作用。

    加载方式:

    1.符号解析时,或者字节码执行的时候会触发其他类的加载

    2.通过反射进行加载

    3.通过classLoader进行加载

    操作的对象:二进制流

    最后的结果:在方法区中,分配了内存空间,创建了类C的Class对象,并且可以通过Class对象,访问这篇内存空间中的数据,该内存空间中主要以常量池和符号引用,直接引用的形式存储在方法区中。

    执行时机:jvm中并没有对类的加载时机有明确要求,有要求的只是初始化,但是在初始化之前,必须完成加载,链接的操作(除了解析过程)

     

    在大环境中的作用:在整个加载到初始化的过程中,加载流程使得外部的数据能够加载到jvm的运行时数据区中,能够顺利执行流程的第一步

     

     

    展开全文
  • 通过加载类的方式将class文件读取进来成为一个类 我该怎么用接口A回调这个反射的类呢 Class clazz=classloader(B) Object o=clazz.newinference 我接下来应该怎么用接口A类型的引用来对B中的方法实现接口回调? ....

    请问如何对本地加载来的接口实现类进行接口回调

    我是JAVA初学者
    我有一个接口A
    和一个A的实现类B.class文件
    我通过加载类的方式将class文件读取进来成为一个类
    我该怎么用接口A回调这个反射的类呢
    Class clazz=classloader(B)
    Object o=clazz.newinference
    我接下来应该怎么用接口A类型的引用来对B中的方法实现接口回调?

    展开全文
  • 要想分析一个类,必须有这个类的元数据,java中描述类的元数据的类是Class类,元数据就是类自己的数据 要想得到Class类对象,可以有多种方法 1、通过Class.forName加载类 2、通过对象.getClass 先提醒一下,...

    反射作用于分析类
    要想分析一个类,必须有这个类的元数据,java中描述类的元数据的类是Class类,元数据就是类自己的数据
    要想得到Class类对象,可以有多种方法
    1、通过Class.forName加载类
    2、通过对象.getClass

    1、基础类

    下面的所有的探寻反射的方法都是基于下面这个类修改来的

    package com.test;
    
    import java.io.Serializable;
    
    public class TestPojo implements Serializable,Cloneable{
    	
    	public String a;
    	private Test t;
    	public TestPojo() {
    		
    	}
    	public TestPojo(String s) {
    		
    	}
    	public void f1() {
    		System.out.println("没有参数的f1");
    	}
    	public void f1(String s) {
    		System.out.println("有一个String参数的f1");
    		
    	}
    	public void f1(int s) {
    		System.out.println("有一个int参数的f1");
    	}
    	public void f1(String s,int i) {
    		System.out.println("有两个参数的分别为String和int的f1");
    	}
    	
    }
    

    2、Class方法

    Class clazz = Class.forName("com.test.TestPojo");//得到类对象
    

    (1)得到类的修饰符

    clazz.getModifiers()
    

    我就不分开了,下面的表格是类,方法,成员变量的修饰符

    修饰符
    不写 0
    public 1
    final 16
    protected 4
    private 2
    static 8
    volatile 64
    transient 128
    synchronized 32
    abstract 1024
    native 256

    注意
    你可能会遇上值为17或者不是上面这些值的,尤其是在下面的操作中,这是因为类的修饰符为 public final修饰的,是16+1=17;如果得出其他的值请不要慌张或者我靠,试试上面的某些值相加是否得出你的值

    (2)获得类的接口

    Class[] interfaces = clazz.getInterfaces();
    		for(Class i : interfaces) {
    		    //获得Class的简单名字,如果直接打印i,会打印出接口的包名.类名
    			System.out.println(i.getSimpleName()); 
    		}
    

    在这里插入图片描述

    (3)获得对象的成员变量

    获得对象可见变量

    Field [] fd = clazz.getFields();//得到可见的成员变量		
    		for(Field f : fd) {
    			System.out.println(f.getName()); //变量的别名
    			System.out.println(f.getType());  //修饰符
    			System.out.println(f.getModifiers()); //成员变量的修饰符值
    		}
    

    在这里插入图片描述
    获得对象所有变量(不管可见不可见),俗称暴力破解

    Field [] fd = clazz.getDeclaredFields(); //获得全部变量
    		for(Field f : fd) {
    			System.out.println(f.getName()); //变量的别名
    			System.out.println(f.getType());  //修饰符
    			System.out.println(f.getModifiers()); //成员变量的修饰符值
    		}
    

    在这里插入图片描述
    这是成员变量暴力破解,要和下面方法的暴力破解做出区分

    3、方法Method

    (1)Method方法获得方法的信息

    获得公开的方法
    获得Class里f1,且无参的方法赋给m

    Method m = clazz.getDeclaredMethod("f1", null);  
    
    Method m = clazz.getMethod("f1", null);  
    

    把隐藏的方法公开,暴力破解方法
    f1的修饰符换成private

    Method m = clazz.getDeclaredMethod("f1", null); //不能用getMethod,要不会报错
    m.setAccessible(true); //true 可以显示隐藏的
    

    如果有参数null 换成 参数类型.class

    m.getModifiers(); //也有获得方法的修饰符的值
    m.getName();  //获得方法的名字,也就是上面的f1
    m.getReturnType();  //返回类型,比如 void
    

    (2)执行方法

    Object obj = clazz.newInstance(); //首先实例化class
    Method m = clazz.getDeclaredMethod("f1", int.class); //找出class的方法
    m.invoke(obj, 5);   //执行方法,参数:类的对象,方法的参数
    

    提醒
    如果是数组类型的怎么写呢?
    答:那就以int数组为例,上面的获得class里执行方法里的第二个参数换成int[ ].class
    例:clazz.getDeclaredMethod("f1", int[].class)

    4、实例化class方法

    有两种:

    1. 类对象直接实例化
    2. 用构造方法实例化对象

    区别:第一种不能带参数,第二种可以带参数
    第一种方式

    Object obj = clazz.newInstance();
    

    第二种方式

    Constructor c1 = clazz.getDeclaredConstructor(String.class); //参数为一个String
    Object obj = c1.newInstance("55");  //写生你构造器的参数
    

    5、获得注解

    (1)方法上的注解

    把基础类的一个方法加上注解

    @Deprecated
    @SuppressWarnings("unused")
    	public void f1(int s) {
    		System.out.println("有一个int参数的f1");
    	}
    

    执行

    Method m = clazz.getDeclaredMethod("f1", int.class);
    Annotation[] anns = m.getDeclaredAnnotations();
    for(Annotation ann : anns) {
    		System.out.println(ann);
    	}
    

    在这里插入图片描述
    只有一个,因为注解 @SuppressWarnings(“unused”) 不是运行时注解,所以执行时就不会找到

    (2)类上的注解

    Annotation[] anns = clazz.getDeclaredAnnotations();
    

    6、获得类上的泛型

    目前本人只知道这一种方法,不是说只有这一种
    通过继承父类的方式来反射泛型

    父类

    public class TestPojo <T>{
    	private Class genericityClass;//泛型
    	
    	public Class getGenericityClass() {
    		if(genericityClass == null) {
    			genericityClass = Until.getGenericityClass(this.getClass()); //获得泛型
    		}
    		return genericityClass;
    	}
    }	
    

    子类(空的)

    public class TestPojoExte extends TestPojo<String> {
    
    }
    

    工具类

    public  class  Until {
    	public static Class getGenericityClass(Class clazz) {
    		
    		return getGenericityClass(clazz, 0); //调下面的方法
    		
    	}
    	private static Class getGenericityClass(Class clazz,int index) {
    		
    		Type type = clazz.getGenericSuperclass(); 
    		if(type instanceof ParameterizedType) {
    			Type[] params = ((ParameterizedType) type).getActualTypeArguments();
    			if(params != null && (params.length >= (index - 1))) {
    				return (Class) params[index];
    			}
    		}
    		
    		return clazz;
    		
    	}
    }
    
    

    执行

    public static void main(String[] args) throws Exception{
    		TestPojo<String> t = new TestPojoExte();
    		System.out.println(t.getGenericityClass());
    	
    	}
    

    在这里插入图片描述

    展开全文
  • 学习过Java的朋友肯定都听说过“反射”一词,所谓反射,就是对于任意一个类,在运行状态下都能够知道这个类的所有属性和方法,并可以对这些方法动态调用的一种机制。反射可以用于编写服务框架程序时,通过配置的手段...
  • 在Java中我们可以通过反射来根据类名创建实例,那么在Python我们怎么实现类似功能呢?其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块
  • 简介在Java中我们可以通过反射来根据类名创建实例,那么在Python我们怎么实现类似功能呢?其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:12345def createInstance...
  • 简介在Java中我们可以通过反射来根据类名创建实例,那么在Python我们怎么实现类似功能呢?其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:def createInstance(module...
  • 作者 |ewenll责编 | 夕颜出品 | CSDN博客Java代码在计算机中经历的阶段:三个阶段...这个阶段称为源码阶段,通过加载器进入内存,在内存中生成一个Class对象,这个阶段为Class类对象阶段,一个类的Class对象中...
  • Java反射机制你还不会?那你怎么看Spring源码

    千次阅读 多人点赞 2020-05-01 20:16:49
    1.Java代码在计算机中经历的阶段:三个阶段 Person.java经过javac编译,变为Person.class文件(字节码文件),字节码文件中,主要有...一个类的Class对象中存储了类的全部信息,使用这个类对象的阶段称为Runtime运...
  • 作者 |ewenll责编 | 夕颜出品 | CSDN博客Java代码在计算机中经历的阶段:三个阶段...这个阶段称为源码阶段,通过加载器进入内存,在内存中生成一个Class对象,这个阶段为Class类对象阶段,一个类的Class对象中...
  • 反射:就是原来需要new对象这是编译阶段就确定了,而反射就是再运行阶段根据给出加载的类来确定new哪一个对象,用哪个方法。...至于怎么实现这种运行阶段加载的过程就不是我这个阶段应该去想了。 ...
  • java反射机制

    2014-04-19 00:56:29
    通常我们创建一个对象,只需要一句话new,但是new的前提是在知道类名的情况下,如果不知道类名,怎么得到这个类的对象呢? 其实我们可以通过反射来实现。一个java程序在运行时,可以获得任何一个类的字节码信息,...
  • 反射可以通过类名获取到对应的Class,可以通过方法名获取到Method并通过invoke方法调用获取到的方法. 应用场景:这样一个应用程序,它支持动态的功能扩展,也就是说程序不重新启动但是可以自动加载新的功能,这个功能...
  • 一般启动Tomcat会是运行startup.bat或者startup.sh文件,实际上这两个...这个main方法主要做了两件事情,1:定义和初始化了tomcat自己的类加载器,2:通过反射调用了org.apache.catalina.startup.Catalinaprocess方法
  • NeheOpenGL教程电子书

    2018-04-07 12:25:03
    这个教程里,我将教你在Windows环境中创建OpenGL程序.它将显示一个空OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序框架. 理解OpenGL如何工作非常重要,你可以在教程末尾下载源程序...
  • CGLIB Enhancement failed...

    2010-08-27 13:26:00
    加载情况下 load方法中 Cglib会为你加载的类自动生成一个代理,但是这个代理通过jdk反射机制生成,那么就要求你原来java中必须要有无参构造方法。。。我就错在这里了加上无参构造方法。OK. ...
  • 概念:设计一个类,这个类只能创建一个对象。(限制创建对象对象数量) 2. 怎么设计? 控制创建对象数量 => 创建对象通过new 调用构造方法 => 控制构造方法就能控制创建对象 控制调用构造方法 =...
  • 一般来说,应用程序可以通过以下两种途径来实现以上的方法: 1. 在父窗口里,截获自身的或者由子元素(包括控件和菜单等元素)传递的关于界面绘制的消息; 2. 子类化子元素,或者为子元素准备一新的(一般来说该...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    我把另一个构造器里的代码复制、粘贴到这个构造器里不就可以了吗? 143 5.6 类的继承 144 5.6.1 继承的特点 144 5.6.2 重写父类的方法 145 5.6.3 父类实例的super引用 146 学生提问:我们只是创建了一个Ostrich...
  • 4.3.4 在自己代码中,如果创建一个java.lang.String类,这个类是否可以被类加载加载?为什么。 4.3.5 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。 ...
  • 这个教程里,我将教你在Windows环境中创建OpenGL程序.它将显示一个空OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序框架. 理解OpenGL如何工作非常重要,你可以在教程末尾下载源程序...
  • asp.net知识库

    2015-06-18 08:45:45
    通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

怎么通过反射加载这个类的方法