⑴ java invoke 反射的使用方法
你这个类是一个严格的JavaBean格式。。所以先可以获得属性。。然后获得读写方法。。然后写值。。读值。。hibernate其实也就是采用的这种差不多的方式。。
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("TaskProvidePropsList");//这里的类名是全名。。有包的话要加上包名
Object obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
//写数据
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method wM = pd.getWriteMethod();//获得写方法
wM.invoke(obj, 2);//因为知道是int类型的属性,所以传个int过去就是了。。实际情况中需要判断下他的参数类型
}
//读数据
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method rM = pd.getReadMethod();//获得读方法
Integer num = (Integer) rM.invoke(obj);//因为知道是int类型的属性,所以转换成integer就是了。。也可以不转换直接打印
System.out.println(num);
}
}
}
⑵ java 中 invoke()的作用是什么
invoke(调用)就是调用Method类代表的方法。可以实现动态调用,例如可以动态的传人参数,可以把方法参数化。
可以把方法参数化invoke(class, method),比如Test类里有一系列名字相似的方法setValue1、setValue2等等,可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue。
此外,invoke()对带有指定参数的指定对象调用,个别参数被自动解包,与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。如下
public Object invoke(Object obj,Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
如果底层方法是静态的,那么可以忽略指定的obj参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的args数组长度可以为 0 或 null。
如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
语言特点
1.简单性
Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。
2.分布性
Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。
3.编译和解释性
Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。
⑶ java反射机制 如何给不定参数invoke
invoke(Object obj,Object... args)
invoke方法本类就要两个参数的啊 第一个参数是调用方法的对象 第二个参数本来就是个可变参
直接在后面传就可以了
BTW:可变参数在Java底层实现的时候就是个数组而已 实在不行你可以提供数组类型的参数来匹配可变参数
invoke(obj,new Object{参数1,参数2,参数3});
如果还不明白那么qq找我吧:)
⑷ Java反射invoke怎么用
Java反射中invoke的用法,我给你个例子,你看看吧(每一句都有注释)
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
public class S{
public void test(){
System.out.println("test");
}
public static void main(String[] args) throws Exception {
//获取S类
Class clzz = Class.forName("S");
//获取S类默认无参构造方法
Constructor con = clzz.getDeclaredConstructor();
//创建一个S类实例对象
S s =(S)con.newInstance();
//获取S类的公有成员方法test
Method m=clzz.getDeclaredMethod("test");
//调用S类对象s中的公有成员方法test
m.invoke(s);
}
}
⑸ java中反射的三种方法是
第一种:通过forName()方法;
第二种:类.class;
第三种:对象.getClass()。
举例如下:
package
test;
public class Demo{
public static void
main(){
Class<?> c1 = null;
Class<?> c2 =
null;
Class<?> c3 =
null;
//三种反射用实例化方式
try{
//最常用的一种形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通过Object类中的方法实例化
c2
= new X().getClass();
//通过类.class实例化
c3 =
X.class;
System.out.println("类名:" + c1.getName());
//得到类名
System.out.println("类名:" + c2.getName());
//得到类名
System.out.println("类名:" + c3.getName());
//得到类名
}
}
⑹ java反射中method类中的invoke方法是做什么的,他有什么作用
首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数。下面是一个简单的例子。
publicclassMethodTest
{
publicstaticvoidmain(String[]args)
{
String[]names={"tom","tim","allen","alice"};
Class<?>clazz=Test.class;
try
{
Methodmethod=clazz.getMethod("sayHi",String.class);
for(Stringname:names)
method.invoke(clazz.newInstance(),name);
}catch(NoSuchMethodExceptione)
{
e.printStackTrace();
}catch(IllegalAccessExceptione)
{
e.printStackTrace();
}catch(IllegalArgumentExceptione)
{
e.printStackTrace();
}catch(InvocationTargetExceptione)
{
e.printStackTrace();
}catch(InstantiationExceptione)
{
e.printStackTrace();
}
}
}
classTest
{
publicvoidsayHi(Stringname)
{
System.out.println("Hi"+name);
}
}
⑺ 求教Java里面如何反射invoke父类的overriden方法
import java.lang.reflect.Method;
public class InvokeTest {
public static void main(String[] args) {
Class<?> clazz;
Object obj;
try {
InvokeTest it = new InvokeTest();
clazz = Class.forName("com.test.invoke.User");
obj = clazz.newInstance();
Param p = new Param();
p.setMethodName("introction");
p.setParamTypes(new Class<?>[]{String.class,int.class});
p.setParamValuese(new Object[]{"Tom",20});
Object result = it.call(obj, p);
System.out.println(result+"");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 反射方法调用
* @param declareCLass classInstatnce
* @param param 参数设置类
* @return
* @throws Exception
*/
public Object call(Object declareCLass, Param param) throws Exception {
Class<?> clazz = declareCLass.getClass(); //获取class对象
String name = param.getMethodName(); //从param类中获取调用方法名
Class<?>[] methodParamTypes = param.getParamTypes(); //从param类中获取调用方法参数类型
Object[] objs = param.getParamValuese(); //从param类中获取调用方法参数值
Method method = clazz.getDeclaredMethod(name, methodParamTypes); //通过class对象获取对应的方法
return method.invoke(declareCLass, objs); //invoke调用方法,传入 classInstance、 参数值
}
}
/**
* 参数设置类
* @author Administrator
*
*/
class Param {
private String methodName;
private Class<?>[] paramTypes;
private Object[] paramValuese;
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Class<?>[] getParamTypes() {
return paramTypes;
}
public void setParamTypes(Class<?>[] paramTypes) {
this.paramTypes = paramTypes;
}
public Object[] getParamValuese() {
return paramValuese;
}
public void setParamValuese(Object[] paramValuese) {
this.paramValuese = paramValuese;
}
}
class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("called method setName value = " + name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("called method setAge value = " + age);
this.age = age;
}
public String introction(String name,int age){
return "My name is "+name+". I'm "+age+" years old.";
}
}
⑻ java中invoke()的作用是什么
用来执行一个方法,是反射中知识 。
就是调用类中的方法,最简单的用法是可以把方法参数化invoke(class, method)。
比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。
可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
⑼ java中的反射,invoke方法详解
就是调用类中的方法,最简单的用法是可以把方法参数化,invoke(class, method)比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue
如:publicclass MyTest{publicstaticvoidmain(String[]args) {String[]names={"tom","tim","allen","alice"};
Class<?>clazz=Test.class;try Methodmethod=clazz.getMethod("sayHi",String.class);for(Stringname:names)method.invoke(clazz.newInstance(),name);}catch(NoSuchMethodExceptione)e.printStackTrace();}catch(IllegalAccessExceptie.printStackTrace(}catch(IllegalArgumentException{e.printStackTrace();}catch(InvocationTargetExceptione)e.printStackTrace();}catch(InstantiationExceptione{e.printStackTrace(}classTest{publicvoidsayHi(Stringname){System.out.println("Hi"+name);}