本文目录
- java反射调用方法可以传非基本类型吗如对象、接口
- java中反射的三种方法是
- 在JAVA中,怎么利用反射获取一个方法
- java怎么通过反射的方式调用可变形参的方法
- 关于用java反射调用一个类里面的方法并执行
- java 反射机制的几个调用方法
- java 反射调用方法有什么用
- java中的反射,invoke方法详解
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); }