java的反射应用
class B{
public static void main(String[] arg){
Class c_a = Class.forName(packageName + "." + "A");
Object obj_a = c_a.newInstance();
Method do_m = c_a.getDeclaredMethod("do",new Class[]{});
//prepare data for the mathod
do_m.invoke(obj_a, new Object[]{});
}
}
原本觉得反射挺麻烦的,其实仔细看,想一想,其实反射也是很自然的。就好在其它的C++的代码中,如果需要调用DLL的话,也是需要先声明调用的方法,然后再调用的。反射很类似这种情况。先声明一个方法
Method m = c_a.getDeclaredMethod("do", new Class[]{});
然后再调用
m.invoke(obj_a, new Object[]{}); |
反射其实利用起来很简单,但是却可以解决很多问题,不可不说这是一个很好的工具。虽然代码显得比较多,但是细想之下,其实很也是很自然的事情,并不需要努力去记忆什么东西。
import java.lang.reflect.Method;
public class InvokeMethods {
public static void main(String[] args) {
Employee emp = new Employee();
Class cl = emp.getClass();//是Class,而不是class
// /getClass获得emp对象所属的类型的对象,Class就是类的类
// /Class是专门用来描述类的类,比如描述某个类有那些字段,
// /方法,构造器等等!
try {
// /getMethod方法第一个参数指定一个需要调用的方法名称
// /这里是Employee类的setAge方法,第二个参数是需要调用
// 方法的参数类型列表,是参数类型!如无参数可以指定null
// /该方法返回一个方法对象
Method sAge = cl.getMethod("setAge", new Class[] { int.class });//参数必须和方法中一样int和Integer,double和Double被视为不同的类型
Method gAge = cl.getMethod("getAge", null);
Method pName = cl.getMethod("printName",
new Class[] { String.class });
Object[] args1 = { new Integer(25) };
// 参数列表
// emp为隐式参数该方法不是静态方法必须指定
sAge.invoke(emp, args1);
Integer AGE = (Integer) gAge.invoke(emp, null);
int age = AGE.intValue();
System.out.println("The Employee Age is: " + age);
Object[] args3 = { new String("Jack") };
pName.invoke(emp, args3);
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}
class Employee {
// 定义一个员工类
public Employee() {
age = 0;
name = null;
}
// 将要被调用的方法
public void setAge(int a) {
age = a;
}
// 将要被调用的方法
public int getAge() {
return age;
}
// 将要被调用的方法
public void printName(String n) {
name = n;
System.out.println("The Employee Name is: " + name);
}
private int age;
private String name;
}
java的反射应用的更多相关文章
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
随机推荐
- git 命令行 修改文件 并push(阿里云)
==============安装git后的准备https://code.aliyun.com/profile/keyshttps://code.aliyun.com/help/ssh/README = ...
- spring eureka required a bean of type 'com.netflix.discovery.DiscoveryClient' that could not be found.
spring在集成第三方过程很容易出现类名相同,且基本作用相同的类.这样给初学者带来一定的困惑. 导致用错类而出现以下问题. required a bean of type 'com.netflix. ...
- 学习笔记之Cloud computing
Cloud computing - Wikipedia https://en.wikipedia.org/wiki/Cloud_computing
- SQL 字段查找
select [name] from sysobjects where [id] in (select [id] from syscolumns where [name]='a1') SQL 2005 ...
- ROS-RouterOS hAP ac2+usb 4G上网卡+小米新推的无线上网卡是绝配
月租9元.每日缴1元.上网不限量 Model Tested RouterOS version Format Passthrough support TechnologiesZTE MF823 v6.8 ...
- 安卓手机安装虚拟定位的方法Xposed安装器+模拟位置(Xposed模块)
原文:https://www.52pojie.cn/thread-571328-1-1.html 未测试,据说只支持某些手机,小米和华为很难安装,建议买其他品牌. Xposed安装器步骤:·ROOT你 ...
- GitLab更新远程分支信息
项目开发中,当远程分支有变动,有人增加或删除了某些分支,而自己本地没有及时自动刷新出来分支的时候,可以用以下命令来更新以下分支信息 git fetch origin --prune 恩,就酱-
- JpGraph使用详解之中文乱码解决方法
在前面的JpGraph使用详解这篇文章,已经对JpGraph的使用方法作了详细的交代,前面说好的,接下来解决中文乱码. JpGraph为什么会出现中文乱码 在JpGraph中默认是要把字符串转成utf ...
- ubuntu18.04修改时区
运行如下命令: sudo tzselect 然后选择亚洲Asia,继续选择中国China,最后选择北京Beijing. 然后创建时区软链 sudo ln -sf /usr/share/zoneinfo ...
- CentOS 配置软raid
v-box里面新建一个centos7.3的服务器 v-box中增加4块8GB容量的硬盘.(我增加的是nvme的ssd硬盘,普通硬盘也没有问题,容量大代表你需要等待的时间长,所以小点容量最好) 创建ra ...