JAVA中反射机制三
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223
反射三 利用反射获取对象的方法,并调用方法
1.利用反射获取对象的方法,我们仍然利用上面的Person类,然后在里面建立方法,方法我们知道有无参方法,有参方法,私有方法,静态方法,如下所示:
package study.reflect;
import java.io.InputStream;
import java.util.List;
public class Person
{
/**
* 为了测试用
*/
public String name = "test";
public Person()
{
}
public Person(String name)
{
System.out.println("name:"+name);
}
public Person(String name,int age)
{
System.out.println("name:"+name+",age:"+age);
}
private Person(List list)
{
System.out.println("list");
}
public void sayHello()
{
System.out.println("hello");
}
public void sayHello(String name)
{
System.out.println("hello,"+name);
}
public String sayHello(String name,int age)
{
System.out.println("hello,"+name+",age:"+age);
return name;
}
private void sayHello(InputStream in)
{
System.out.println("inputStream");
}
public static void sayHello(Person person)
{
System.out.println(person);
}
}
2.通过反射我们要获取方法,并执行方法,代码如下:
package study.reflect;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import org.junit.Test;
/**
* 解析类,并调用方法
* @author Pony
*
*/
public class Demo03
{
@Test
public void test01() throws Exception
{
Class<?> clazz = Class.forName("study.reflect.Person");
Person person = (Person) clazz.newInstance();
Method method = clazz.getMethod("sayHello", null);
method.invoke(person, null);
}
@Test
public void test02() throws Exception
{
Class<?> clazz = Class.forName("study.reflect.Person");
Person person = (Person) clazz.newInstance();
Method method = clazz.getMethod("sayHello", String.class);
method.invoke(person, "world");
}
@Test
public void test03() throws Exception
{
Class<?> clazz = Class.forName("study.reflect.Person");
Person person = (Person) clazz.newInstance();
Method method = clazz.getMethod("sayHello", String.class,int.class);
method.invoke(person, "world",12);
}
@Test
public void test04() throws Exception
{
Class<?> clazz = Class.forName("study.reflect.Person");
Person person = (Person) clazz.newInstance();
Method method = clazz.getMethod("sayHello",Person.class);
method.invoke(person,person);
}
@Test
public void test05() throws Exception
{
Class<?> clazz = Class.forName("study.reflect.Person");
Person person = (Person) clazz.newInstance();
Method method = clazz.getDeclaredMethod("sayHello",InputStream.class);
method.setAccessible(true);
method.invoke(person,new FileInputStream("D:\\1.txt"));
}
}
3.特殊main方法如何调用:
如果person 中有如下的方法:
public static void main(String[] args) {
System.out.println("main");
}
如果向下面方式:
@Test
public void test06() throws Exception
{
Class<?> clazz = Class.forName("study.reflect.Person");
//Person person = (Person) clazz.newInstance();
Method method = clazz.getMethod("main",String[].class);
//静态方法,所以可以直接传空
method.invoke(null,new String[]{"1","2"});
}
会出现一个下面的错误:
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
产生错误的原因为,在JDK1.4的时候是没有可变参数的因此,传入的是Object[] 数组的方式,那么JDK 拿到数组后就会拆分,这个时候new String[]{“1”,”2”},就会拆分成了两个String类型的参数,那么这个时候去Pesron 中,发现没有两个均为String类型的方法main,这个时候就会出现了上面的额参数个数不匹配,解决的方法为:
method.invoke(null,new String[]{"1","2"});
改成:
method.invoke(null,new Object[]{new String[]{"1","2"}});
这样拆完后,里面就一个参数了,对应到我们要的main上面;因此在遇到数组参数传递的时候需要注意。
JAVA中反射机制三的更多相关文章
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- JAVA中反射机制一
反射一 基本概念 一.反射机制的基本概念 什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法:对于任意一个对象,都能够调用这个对象的任意方法和属性:这种动态获取信息及 ...
- Java中反射机制详解
序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...
- JAVA中反射机制五(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...
- JAVA中反射机制六(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...
- JAVA中反射机制四
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射四 利用反射获取类的属性 1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后 ...
- JAVA中反射机制五(JavaBean的内省与BeanUtils库)
内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...
- JAVA中反射机制二
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射二 利用反射创建对象 1.利用反射创建对象,首先我们创建一个类,类里面,我们知道构造函数有默认的构造函 ...
- java中反射机制通过字节码文件对象获取字段和函数的方法
pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...
随机推荐
- FPGA的软核与硬核
硬核 zynq和pynq系列的fpga都是双ARM/Cortex-A9构成,这里的ARM处理器为硬核,Cortex-A9部分为FPGA部分.即整体分为两部分:PS/PL.PS部分为A9处理器部分,PL ...
- Ubuntu命令行安装显卡驱动
1. sudo apt-et purge nvidia* 卸载原有驱动 2. sudo add-apt-repository ppa:graphics-drivers sudo apt-get upd ...
- FTP渗透测试
在这篇文章中,我们将学习如何在CentOS机器配置ProFTPD的服务.之后,我们将进行渗透测试,以评估FTP服务的安全性,那么我们也将学习漏洞的对策. 在CentOS Linux机器的安装和配置FT ...
- 整理sql server数据类型
我们在平常开发过程中,在设计数据的时候,经常碰到数据类型选择的问题,为了更快,更合适地选择正确的数据类型,所以在这里做个总结. 分类 sql server 数据类型 c# 数据类型 描述 应用场景 字 ...
- MySQL 日志功能详解
MySQL日志分类 1:查询日志 :query log 2:慢查询日志:slow_query_log 查询执行时长超过指定时长的查询操作所记录日志 3:错误日志:error log ...
- Cobbler环境搭建
Cobbler服务器系统: CentOS 6.6 64位Cobbler版本: cobbler-2.6.11IP地址:192.168.166.136 1.安装epel库 rpm -ivh http:// ...
- 【php】header下载文件后,文件变大的问题;(ob_clean()清空缓存)
事由: 按照常理,为了下载一个生产的文件,都是使用header函数,指定下文件信息,然后开始下载,但是下载后发现,文件体积总是比源文件要大2个字节,源文件是24字节,下载后是26字节,查看服务器返回的 ...
- 第204天:js---重载和多态
一.根据arguments个数实现重载 js本身不支持重载,所以只能通过其他方式实现,arguments检测传参的个数,然后再执行不同的方式 function add() { var sum = 0 ...
- 【EF】EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- H5跳转到百度地图并定位
找了半天的JS api,发现没有,后来发现这个叫 url api,让我好找. 官方文档: http://lbsyun.baidu.com/index.php?title=uri/api/web : 简 ...