Java,反射的用法,getDeclaredMethods与getMethods 的区别
2018-01-06 14:21
411 查看
/** * Title: Food * Description: * @date 2018/1/6 13:49 */ public interface Food { public void interfaceGetColor(); }
/** * Title: Animal * Description: * @date 2018/1/6 13:48 */ public class Animal { public void animalEat() { } protected void animalRun() { } private void animalShout() { } public static void animalSleep() { } void animalDefaultMethod() { } }
/** * Title: Cat * Description: * @date 2018/1/5 13:51 */ public class Cat extends Animal implements Food { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } private static void saySomething(String something) { System.out.println(something); } public String eatSomething(Integer conut, String something) { return "吃" + conut + "条" + something; } public String getName() { return "Tom Cat"; } @Override public void interfaceGetColor() { } protected void sleep() { } private void look() { } void defaultMethod(){ } }
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /*public native Object invoke(Object receiver, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException; 第一个参数是方法属于的对象(如果是静态方法,则可以直接传 null) 第二个可变参数是该方法的参数 如果调用的方法有抛出异常,异常会被 java.lang.reflect.InvocationTargetException 包一层*/ /* getDeclaredMethod():自身所有的方法,实现的接口的方法 (包括public/private/protected/default修饰的方法),不包括父类的方法 getMethod():自身的公有方法,父类的公有方法,实现的接口的方法(仅包括public修饰的方法) method.getName:打印方法的名称 method.toString:打印方法的完整签名 */ public class Main { public static void main(String[] args) { try { Class<?> clazz = Class.forName("Cat"); Cat cat = (Cat) clazz.newInstance();//new关键字和newInstance()方法的区别,https://www.cnblogs.com/yunger/p/5793669.html try { Method method = clazz.getDeclaredMethod("getName");//没有入参 //Method method = cat1.getClass().getDeclaredMethod("getName");//正确 //Method method = cat1.getClass().getMethod("getName");//正确 System.out.println((String) method.invoke(cat)); //正确 ,非static方法的入参对象不能为空 //System.out.println((String) method.invoke(null)); //错误, //method = clazz.getDeclaredMethod("saySomething");//错误 Class[] classes = new Class[1]; classes[0] = String.class; method = clazz.getDeclaredMethod("saySomething", classes);//这里要确定参数的类型 method.setAccessible(true);//访问私有方法需要设置为true //method.invoke(null, "这是输入参数");//调用saySomething方法 正确 method.invoke(cat, "这是输入参数");//调用saySomething方法 正确,static方法的入参对象可以为空或非空 Class[] classes1 = new Class[2]; classes1[0] = Integer.class; classes1[1] = String.class; method = clazz.getDeclaredMethod("eatSomething", classes1); System.out.println(method.invoke(cat, 2, "鱼")); List<Cat> list = new ArrayList<Cat>(); Cat cat1 = new Cat(); Cat cat2 = new Cat(); Cat cat3 = new Cat(); cat1.setId(1L); cat2.setId(2L); cat3.setId(3L); list.add(cat1); list.add(cat2); list.add(cat3); method = clazz.getDeclaredMethod("getId");//没有入参 System.out.println((Long) method.invoke(list.get(list.size() - 1))); //正确 ,非static方法的入参对象不能为空 Class[] classes2 = new Class[1]; classes2[0] = Long.class; method = clazz.getDeclaredMethod("setId", classes2); method.invoke(cat3, 33L); method = clazz.getDeclaredMethod("getId");//没有入参 System.out.println((Long) method.invoke(cat3)); //正确 ,非static方法的入参对象不能为空 } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } //getDeclaredMethods 与 getMethods 的区别 System.out.println("getDeclaredMethods 与 getMethods 的区别"); System.out.println("\n"); Method[] declaredMethods = clazz.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println(declaredMethod.toString());//自身所有的方法,实现的接口的方法 } System.out.println("\n"); Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method.toString());//自身的公有方法,父类的公有方法,实现的接口的方法 } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } /*Tom Cat 这是输入参数 吃2条鱼 3 33 getDeclaredMethods 与 getMethods 的区别 public java.lang.String Cat.getName() public java.lang.Long Cat.getId() protected void Cat.sleep() public void Cat.interfaceGetColor() private static void Cat.saySomething(java.lang.String) public java.lang.String Cat.eatSomething(java.lang.Integer,java.lang.String) public void Cat.setId(java.lang.Long) private void Cat.look() void Cat.defaultMethod() public java.lang.String Cat.getName() public java.lang.Long Cat.getId() public void Cat.interfaceGetColor() public java.lang.String Cat.eatSomething(java.lang.Integer,java.lang.String) public void Cat.setId(java.lang.Long) public void Animal.animalEat() public static void Animal.animalSleep() public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll()*/
相关文章推荐
- java反射中getDeclaredMethods和getMethods的区别
- Java反射getMethods()与getDeclaredMethods()区别
- java反射中getDeclaredMethods和getMethods的区别
- java反射中getDeclaredMethods和getMethods的区别
- Java 反射(Reflection) - Class 类 getMethod、getMethods、getDeclaredMethod、getDeclaredMethods四者区别
- java中Class.getMethods()和Class.getDeclaredMethods()方法的区别
- 反射中getMethods 与 getDeclaredMethods 的区别
- java反射之Class.getMethod与getDeclaredMethods()区别
- 试用Java中的反射reflect之getDeclaredMethods和getMethods
- Java中的反射reflect之getDeclaredMethods和getMethods
- 反射中getMethods 与 getDeclaredMethods 的区别
- 反射以及 getDeclaredMethods()和getMethods()区别
- 反射中getMethods 与 getDeclaredMethods 的区别
- 反射中getMethods 与 getDeclaredMethods 的区别
- 反射中getMethods 与 getDeclaredMethods 的区别
- java 反射机制 之 getMethods获取所有公有方法 和 getDeclaredMethods 获取本类所有方法
- 反射中getMethods 与 getDeclaredMethods 的区别
- Java反射 : Declared的作用 ( 例如 : getMethods和getDeclaredMethods )
- Java反射代码 得到某类的所有字段 getFields()与getDeclaredFields()区别 getMethod()和getDeclaredMethod()区别
- Java 反射机制中 getMethod()和getDeclaredField()区别