method.invokemethodinvoke返回值
本文目录一览:
- 1、method的invoke方法怎么用
- 2、Method对象中invoke方法中第一个参数表示____
- 3、java Method invoke 抛出异常
- 4、java反射中method类中的invoke方法是做什么的,他有什么作用?
method的invoke方法怎么用
public class Names {
public String firstName = "Callan";
public String lastName = "Wang";
public String getFullName(){
return firstName + " " + lastName;
}
public String getFullName(String firstName,String lastName){
return firstName + " " + lastName;
}
}
import java.lang.reflect.InvocatiONTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Names methods = new Names();
// 调用getFullName()方法
Method method1 = methods.getClass().getMethod("getFullName");
Object obj1 = method1.invoke(methods, null);
System.out.println(obj1);
// 调用getFullName(String firstName,String lastName)方法
Method method2 = methods.getClass().getMethod("getFullName", new Class[]{String.class,String.class});//方法带有两个String类型的参数
// invoke(从中调用基础方法的对象,用于方法调用的参数)
Object obj2 = method2.invoke(methods, new String[]{"Callan","Wang"});
System.out.println(obj2);
}
}
Method对象中invoke方法中第一个参数表示____
invoke方法的第一个参数是一个对象。
此对象可以为:①方法持有者;②方法持有者的继承者。
例子:父类有方法
public class Father {
public void say(String name){
System.out.println("我是father叫"+name);
}
}
子类有方法
public class Son extends Father {
@Override
public void say(String name){
System.out.println("我是son我叫"+name);
}
}
测试类
public class TestInvoke {
public void test() throws Exception {
Class clazz = Class.forName("CloneObject.Father");//反射父类
Father father = new Father();//实例化父类
Son son = new Son();//实例化子类
Object object=clazz.newInstance();//获得一个新的父类对象
Method method = clazz.getMethod("say",String.class);
method.invoke(father,"爸爸");
method.invoke(son,"孩子");
method.invoke(object,"新的父亲");
}
public static void main(String[] args) throws Exception {
new TestInvoke().test();
}
}
结果
我是father叫爸爸
我是son我叫孩子
我是father叫新的父亲
java Method invoke 抛出异常
InvocationTargetException异常由Method.invoke(obj, args...)方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收。
示例:
package com.zzj.test.reflect;
public class Reflect {
public void run(int i) throws ZeroException {
B b = new B();
b.run(i);
}
}
class B {
public void run(int i) throws ZeroException {
if (i 0) {
throw new ZeroException("参数不能小于零!");
}
System.out.println("参数:" + i);
}
}
class ZeroException extends Exception {
private static final long serialVersionUID = 1L;
private String detailMessage;
public ZeroException(String detailMessage) {
this.detailMessage = detailMessage;
}
public String getMessage() {
return detailMessage;
}
}
测试:
package com.zzj.test.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class? clazz = Class.forName("com.zzj.test.reflect.Reflect");
Method method = clazz.getMethod("run", int.class);
method.invoke(clazz.newInstance(), -1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.out.println("此处接收被调用方法内部未被捕获的异常");
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
输出:
此处接收被调用方法内部未被捕获的异常
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.zzj.test.reflect.Test.main(Test.java:11)
Caused by: com.zzj.test.reflect.ZeroException: 参数不能小于零!
at com.zzj.test.reflect.B.run(Reflect.java:13)
at com.zzj.test.reflect.Reflect.run(Reflect.java:6)
... 5 more
也可以直接打印目标异常:
package com.zzj.test.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class? clazz = Class.forName("com.zzj.test.reflect.Reflect");
Method method = clazz.getMethod("run", int.class);
method.invoke(clazz.newInstance(), -1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
System.out.println("此处接收被调用方法内部未被捕获的异常");
Throwable t = e.getTargetException();// 获取目标异常
t.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
输出:
此处接收被调用方法内部未被捕获的异常
com.zzj.test.reflect.ZeroException: 参数不能小于零!
at com.zzj.test.reflect.B.run(Reflect.java:13)
at com.zzj.test.reflect.Reflect.run(Reflect.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.zzj.test.reflect.Test.main(Test.java:11)
java反射中method类中的invoke方法是做什么的,他有什么作用?
首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数。下面是一个简单的例子。
public class MethodTest
{
public static void main(String[] args)
{
String [] names ={"tom","tim","allen","alice"};
Class? clazz = Test.class;
try
{
Method method = clazz.getMethod("sayHi", String.class);
for(String name:names)
method.invoke(clazz.newInstance(),name);
} catch (NoSuchMethodException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (InvocationTargetException e)
{
e.printStackTrace();
} catch (InstantiationException e)
{
e.printStackTrace();
}
}
}
class Test
{
public void sayHi(String name)
{
System.out.println("Hi "+name);
}
}
关于method.invoke和methodinvoke返回值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~