×

java 反射调用方法

java 反射调用方法(java反射调用方法可以传非基本类型吗如对象、接口)

admin admin 发表于2023-08-26 19:17:22 浏览46 评论0

抢沙发发表评论

本文目录

java反射调用方法可以传非基本类型吗如对象、接口

可以的,参数类型是没有限制的。通过以下代码可以证明。

接口:

public interface MyInterface {    void print();}

实现类:

public class MyInterfaceImpl implements MyInterface {    @Override    public void print() {        System.out.println(“interfaceImpl“);    }}

通过反射调用方法:

import java.lang.reflect.Method;public class Test {    public static void main(String args) throws Exception {        Test instance = Test.class.newInstance();        Method method = Test.class.getDeclaredMethod(“test“, MyInterface.class);        MyInterface myInterface = new MyInterfaceImpl();        method.invoke(instance, myInterface);    }    public void test(MyInterface myInterface) {        myInterface.print();    }}

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中,怎么利用反射获取一个方法

java中利用反射获取方法:

1.先找到方法所在类的字节码

2.找到需要被获取的方法

Class类中获取方法:

public Method getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型《》,即后面不接《》

public Method getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

public Method getMethod(String methodName, Class《T》...parameterTypes);表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

parameterTypes:表示获取的方法的参数的Class类型

public Method getDeclaredMethod(String methodName, Class《T》...parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法。

参数:methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如String.class只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。

public Method getDeclaredMethod(String name,Class... parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)

参数: methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如String.class

举例:

class P{public void t1(){}void t2(){}private void t3(){}}class People extends P{public void sayHi() {    System.out.println(“sayHi()“);}public void sayHello(String name) {    System.out.println(“sayHello(String name)   “ + “name = “ + name);}private void sayGoodBye(String name, int age) {    System.out.println(“sayGoodBye(String name, int age)   “ + “name = “ + name + “  age = “ + age);}}public class MethodDemo {public static void main(String args) throws Exception {    Class clazz = People.class;    //获取类自身及父类所有public方法    Method ms = clazz.getMethods();    for (Method m : ms) {        System.out.println(m);    }    System.out.println(“---------------------------“);    //获取类自身所有方法(不会获取父类方法)    ms = clazz.getDeclaredMethods();    for (Method m : ms) {        System.out.println(m);    }    System.out.println(“---------------------------“);    //只能获取父类中的public方法,无法获取到父类的默认权限和private权限方法    Method m = clazz.getMethod(“t1“, null);//public void com.reflex.P.t1()    System.out.println(m);    m = clazz.getMethod(“sayHello“, String.class);    System.out.println(m);    //Exception in thread “main“ java.lang.NoSuchMethodException: com.reflex.People.sayGoodBye(java.lang.String, int)    //getMethod方法只能获取public的//        m = clazz.getMethod(“sayGoodBye“, String.class,int.class);//        System.out.println(m);    m = clazz.getDeclaredMethod(“sayGoodBye“, String.class,int.class);    System.out.println(m);    //带Declared的无法获取父类中的方法//        m = clazz.getDeclaredMethod(“t1“, null);//Exception in thread “main“ java.lang.NoSuchMethodException:com.reflex.People.t1()//        System.out.println(m);}}

java怎么通过反射的方式调用可变形参的方法

ava反射调用可变参数的方法的方式是传入objects参数,如下代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344 public class Reflect { public static void main(String args) throws Exception { Class《?》 clazz = Single.class; Single single = (Single) clazz.newInstance(); List《String》 list = new ArrayList《String》(){ private static final long serialVersionUID = 1L; { add(“fuck“); add(“ni“); add(“mei“); } }; //获取method两种方式, 在method中 数组的的空间大小是可以随便写的不一定使用0 /* 1 */ Method method = clazz.getDeclaredMethod(“method“, Array.newInstance(Object.class, 0).getClass()); /* 2 */ method = clazz.getDeclaredMethod(“method“, (new Object).getClass());//初始化参数

关于用java反射调用一个类里面的方法并执行

Java中要用到反射,首先就必须要获取到对应的class对象,在Java中有三种方法获取类对应的class对象。

1、通过类的.class属性

2、通过类实例的getClass()方法获取

3、通过Class.forName(String className)方法获取

现在比如在package下有个类Calculator

public class Calculator{ public double add(double score1,double score2){ return score1 + score2; } public void print(){ System.out.println(“OK“); } public static double mul(double score1,double score2){ return score1 * score2; }}public class CalculatorTest { public static void main(String args) throws Exception { //通过类的.class属性获取 Class《Calculator》 clz = Calculator.class; //或者通过类的完整路径获取,这个方法由于不能确定传入的路径是否正确,这个方法会抛ClassNotFoundException// Class《Calculator》 clz = Class.forName(“test.Calculator“); //或者new一个实例,然后通过实例的getClass()方法获取// Calculator s = new Calculator();// Class《Calculator》 clz = s.getClass(); //1. 获取类中带有方法签名的mul方法,getMethod第一个参数为方法名,第二个参数为mul的参数类型数组 Method method = clz.getMethod(“mul“, new Class{double.class,double.class}); //invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数 Object result = method.invoke(null, new Object{2.0,2.5}); //如果方法mul是私有的private方法,按照上面的方法去调用则会产生异常NoSuchMethodException,这时必须改变其访问属性 //method.setAccessible(true);//私有的方法通过发射可以修改其访问权限 System.out.println(result);//结果为5.0 //2. 获取类中的非静态方法 Method method_2 = clz.getMethod(“add“, new Class{double.class,double.class}); //这是实例方法必须在一个对象上执行 Object result_2 = method_2.invoke(new Calculator(), new Object{2.0,2.5}); System.out.println(result_2);//4.5 //3. 获取没有方法签名的方法print Method method_3 = clz.getMethod(“print“, new Class{}); Object result_3 = method_3.invoke(new Calculator(), null);//result_3为null,该方法不返回结果 }}

java 反射机制的几个调用方法

import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException;/** * Created by IntelliJ IDEA. * File: TestRef.java * User: leizhimin * Date: 2008-1-28 14:48:44 */ public class TestRef {public staticvoid main(String args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {Foo foo = new Foo(“这个一个Foo对象!“);Class clazz = foo.getClass();Method m1 = clazz.getDeclaredMethod(“outInfo“);Method m2 = clazz.getDeclaredMethod(“setMsg“, String.class);Method m3 = clazz.getDeclaredMethod(“getMsg“);m1.invoke(foo);m2.invoke(foo, “重新设置msg信息!“);String msg = (String) m3.invoke(foo);System.out.println(msg);} } class Foo {private String msg; public Foo(String msg) {this.msg = msg;} public void setMsg(String msg) {this.msg = msg;} public String getMsg() {return msg;} public void outInfo() {System.out.println(“这是测试Java反射的测试类“);} }

java 反射调用方法有什么用

首先你要明白反射机制可以用来做什么Java反射的功能  1)可以判断运行时对象所属的类  2)可以判断运行时对象所具有的成员变量和方法  3)通过反射甚至可以调用到private的方法  4)生成动态代理

java中的反射,invoke方法详解

就是调用类中的方法,最简单的用法是可以把方法参数化,invoke(class, method)比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存进数组v,然后循环里invoke(test,v),就顺序调用了全部setValue

如:public class  MyTest{ 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 (IllegalAccessExcepti e.printStackTrace( } catch (IllegalArgumentException  {e.printStackTrace();} catch (InvocationTargetException e)e.printStackTrace(); } catch (InstantiationException e {e.printStackTrace( }class Test{public void sayHi(String name){ System.out.println(“Hi “+name); }