Java动态加载一个类的几种方法以及invoke
一.加载一个类的几种方法
接口
IUser
package org.me.javaapp;/**** @author Administrator*/
public interface IUser {}
User.java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package org.me.javaapp;public class User implements IUser{private String name;private int id;/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the id*/public int getId() {return id;}/*** @param id the id to set*/public void setId(int id) {this.id = id;}
}
主类
public static void main(String[] args) throws ClassNotFoundException{ try{Class c1=Class.forName("org.me.javaapp.User");Class c2=User.class;Object o1=c1.newInstance();Object o2=c2.newInstance();User u1=new User();Class c3=u1.getClass();/*this.getClass.getClassLoader();// 使用当前类的ClassLoader Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader ClassLoader.getSystemClassLoader(); // 使 用系统ClassLoader,即系统的入口点所使用的ClassLoader。(注意,system ClassLoader与根 ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader) */ClassLoader clo=Thread.currentThread().getContextClassLoader();Class c4=clo.loadClass("org.me.javaapp.User");Field[] fs = c1.getDeclaredFields();for(Field field:fs){ System.out.println("获得属性的修饰符,例如public,static等等 >>"+Modifier.toString(field.getModifiers()));System.out.println("属性的类型的名字 >>"+field.getType());System.out.println("属性的名字 >>"+field.getName());}Method[] ms = c1.getDeclaredMethods();for(Method field:ms){ System.out.println("获得方法的修饰符,例如public,static等等 >>"+Modifier.toString(field.getModifiers()));System.out.println("方法的参数个数 >>"+field.getParameterCount());System.out.println("方法的名字 >>"+field.getName());}System.out.println("c1的父类>>"+c1.getSuperclass());Class[] cs=c1.getInterfaces();for(Class field:cs){ System.out.println("接口的名字 >>"+field.getName());}System.out.println(">>>>>>>>>>>");}catch (Exception ex){System.out.println(ex.toString());}}
输出:
获得属性的修饰符,例如public,static等等 >>private
属性的类型的名字 >>class java.lang.String
属性的名字 >>name
获得属性的修饰符,例如public,static等等 >>private
属性的类型的名字 >>int
属性的名字 >>id
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>0
方法的名字 >>getName
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>0
方法的名字 >>getId
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>1
方法的名字 >>setName
获得方法的修饰符,例如public,static等等 >>public
方法的参数个数 >>1
方法的名字 >>setId
c1的父类>>class java.lang.Object
接口的名字 >>org.me.javaapp.IUser
参考:JAVA中的反射机制
获取方法,和构造方法,不再详细描述,只来看一下关键字:
方法关键字
含义
getDeclaredMethods()
获取所有的方法
getReturnType()
获得方法的放回类型
getParameterTypes()
获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,……)
获得特定的方法
构造方法关键字
含义
getDeclaredConstructors()
获取所有的构造方法
getDeclaredConstructor(参数类型.class,……)
获取特定的构造方法
父类和父接口
含义
getSuperclass()
获取某类的父类
getInterfaces()
获取某类实现的接口
ClassLoader 详解及用途
ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象。
java中的反射总结 【举例不错,很全面】
二.Invoke
一个方法可以生成多个Method对象,但只有一个root对象,主要用于持有一个MethodAccessor对象,这个对象也可以认为一个方法只有一个,相当于是static的,因为Method的invoke是交给MethodAccessor执行的。
package org.me.javaapp;public class Child extends Person{public void say(String s) {System.out.println("Hello invork>>>"+s);}public void add(int a,int b) {a+=b;System.out.println("a+b="+a);}
}
invoke调用
package org.me.test;import java.lang.reflect.Method;
import org.junit.Test;public class TestInvoke {@Testpublic void testSingleton() throws Exception {Class<?> clz = Class.forName("org.me.javaapp.Child");Object o = clz.newInstance();Method m = clz.getMethod("add", int.class,int.class);m.invoke(o, 1,2);m = clz.getDeclaredMethod("say", String.class);m.invoke(o,"http://blog.csdn.net/unix21/");}
}
参考:
java中的反射,invoke方法
getMethod方法第一个参数指定一个需要调用的方法名称
第二个参数是需要调用方法的参数类型列表,是参数类型!如无参数可以指定null。
参数必须和方法中一样int和Integer,double和Double被视为不同的类型。
反射中getMethods 与 getDeclaredMethods 的区别
public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
当然也包括它所实现接口的方法。
JAVA深入研究——Method的Invoke方法【非常深入,讲了实现细节】
可以看到Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理。
每个实际的Java方法只有一个对应的Method对象作为root。这个root是不会暴露给用户的,而是每次在通过反射获取Method对象时新创建Method对象把root包装起来再给用户。
在第一次调用一个实际Java方法对应得Method对象的invoke()方法之前,实现调用逻辑的MethodAccessor对象还没创建;
等第一次调用时才新创建MethodAccessor并更新给root,然后调用MethodAccessor.invoke()真正完成反射调用。
java反射机制详解 及 Method.invoke解释
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
三.Class<?>与Class
Class<?> clz = Class.forName("org.me.javaapp.Child");Class clzz = Class.forName("org.me.javaapp.Child");Object o = clzz.newInstance();Method m = clz.getMethod("add", int.class,int.class);m.invoke(o, 1,2);m = clz.getDeclaredMethod("say", String.class);m.invoke(o,"http://blog.csdn.net/unix21/");
效果是一样的。
Java动态加载一个类的几种方法以及invoke相关推荐
- 动态加载JS脚本的4种方法
动态加载JS脚本的4种方法 2006-12-04 15:33 要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javasc ...
- HTML5动态加载资源方式,动态加载JavaScript文件的两种方法
这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval ...
- 实现动态加载JS脚本有4种方法
转自:微点阅读 https://www.weidianyuedu.com 实现动态加载JS脚本有4种方法: 1.直接document.write 这里重新温习Document.write()的用法, ...
- php动态加载js,动态加载script文件的两种方法_javascript技巧
动态加载script到页面大约有俩方法 第一种就是利用ajax方式,把script文件代码从后台加载到前台,然后对加载到的内容通过eval()执行代码.第二种是,动态创建一个script标签,设置其s ...
- 动态加载JS脚本有4种方法
1.直接document.write <script>document.write("<script src='a.js'><\/script>" ...
- Java中加载properties文件的6种方法
.使用java.util.Properties类的load()方法 示例: InputStream in = lnew BufferedInputStream(new FileInputStream( ...
- [JAVA冷知识]动态加载不适合数组类?那如何动态加载一个数组类?
写在前面 今天和小伙伴分享一些java小知识点,主要围绕下面几点: 既然数组是一个类, 那么编译后类名是什么?类路径呢? 为什么说动态加载不适合数组? 那应该如何动态加载一个数组? 部分内容参考 &l ...
- java动态加载jar时,jar中还有第三方jar无法加载的解决方法
java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...
- echarts java动态数据_[ASP.net教程]ECharts Java 动态加载数据,echartsjava
[ASP.net教程]ECharts Java 动态加载数据,echartsjava 0 2015-12-18 00:00:05 1.前台jsp页面html PUBLIC "-//W3C// ...
最新文章
- 2022-2028年中国高纯铜市场研究及前瞻分析报告
- python 开始学习
- OpenCMS integration with Spring MVC--reference
- Windows Phone 的控件倾斜效果
- ad域不去用frs_Windows Server 2008搭建AD域控服务器 - 小王同学!
- PyTorch + NumPy这么做会降低模型准确率?
- emacs latex_如何使用Emacs创建LaTeX文档
- 机器学习算法总结之聚类:K-means
- SVM-支持向量机(code实现)
- sqlserver自动备份脚本
- 如何在点击a标签下载文件的时候通过JavaScript动态的修改文件的名称?
- 现代控制理论-6李雅普诺夫稳定性
- 专业数字功放工作原理以及应用电路介绍
- Filenet公布首批候选自治社区
- 7.4 SiamFC
- 今日分享:js制作一个简单的新年倒计时
- 网站服务器登录很慢,网站打开速度慢如何解决?有何技巧?
- spark.yarn.jars的配置
- 面对全面收紧外链的微信,H5的春风还能吹多久?
- 关于在Idea里面修改html代码后,打开网页没改变的问题
热门文章
- 安卓网页广告拦截_拦截烦人的网页广告,增加上网体验
- 【camera】基于YOLO的车辆多维特征识别系统(车色,车品牌,车标,车型)与PYQT实现(课程设计)
- 解决方案:__init__() got an unexpected keyword argument ‘kill_previous‘
- 用c语言设计一个菜单界面_用这7个方法设计菜单,让餐厅的利润暴涨
- keras中conv2d,conv2dTranspose的Padding详细介绍
- atom搭建markdown环境
- Pliops XDP(Extreme Data Processor)数据库存储设计的新型加速硬件
- 设计模式 之美 -- 策略模式
- 一文带你看透 GDB 的 实现原理 -- ptrace真香
- CentOS安装中文输入法