Java基础--反射Reflect----Method

原创
2016/03/12 13:26
阅读数 94

    Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。Java反射中获取Method方法如下:

   a、public Method[] getDeclaredMethods()  只获取本类所有的方法,包括private、protected、default、public 访问权限;不包括继承过来的方法;
   b、public Method[] getMethods()  获取该类的public访问权限的方法  包括继承的父类的public方法
public class ParentClass {
    
	private String testParPriv(String value){
		return value;
	}
	public String  testParPub(String value){
		return value;
	}
	protected String testParPro(String value){
		return value;
	}
	String testParDef(String value){
		return value;
	}
	private static String testStaticParPrive(String value){
		return value;
	}
	public static String testStaticParPub(String value){
		return value;
	}
}

 

public class SubClass extends ParentClass {
	
	private String testPriv(String value){
		return value;
	}
	public String  testPub(String value){
		return value;
	}
	public String testPub(String value,String value1){
		return value1;
	}
	protected String testPro(String value){
		return value;
	}
	String testDef(String value){
		return value;
	}
	private static String testStaticPriv(String value){
		return value;
	}
	
	public static void main(String[] args) {
		try {
		    Class<?> clz = SubClass.class;
		    SubClass sub = new SubClass();
		   
		    Method[] methods =  clz.getDeclaredMethods();
		    for (Method method : methods) {
				System.out.println(method.toGenericString());
		     }
		      System.out.println("---------------------------------------------");
		    Method[] publicMethods = clz.getMethods();
		    for (Method method : publicMethods) {
				System.out.println(method.toGenericString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

 运行结果: 

public static void cn.trip.core.servlet.SubClass.main(java.lang.String[])
private static java.lang.String cn.trip.core.servlet.SubClass.testStaticPriv(java.lang.String)
private java.lang.String cn.trip.core.servlet.SubClass.testPriv(java.lang.String)
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String,java.lang.String)
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String)
protected java.lang.String cn.trip.core.servlet.SubClass.testPro(java.lang.String)
java.lang.String cn.trip.core.servlet.SubClass.testDef(java.lang.String)
---------------------------------------------
public static void cn.trip.core.servlet.SubClass.main(java.lang.String[])
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String,java.lang.String)
public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String)
public static java.lang.String cn.trip.core.servlet.ParentClass.testStaticParPub(java.lang.String)
public java.lang.String cn.trip.core.servlet.ParentClass.testParPub(java.lang.String)
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 final void java.lang.Object.wait() 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()
   c、public Method getDeclaredMethod(String name,  Class<?>... parameterTypes) 获取本类中方法名称为name,形参类型为parameterTypes的方法;
   d、public Method getMethod(String name,  Class<?>... parameterTypes) 获取本类或者父类中方法名称为name,形参类型为parameterTypes的public方法;
      由于Java中允许方法重载,因此一个类中可以有多个方法名称相同,但是参数不同的方法;Class<?... parameterTypes表示这个方法可以没有形参,可以由一个或多个;

Method类中部分方法:

  1、public Class<?> getReturnType()  获取方法返回值类型

  2、public Class<?> getDeclaringClass() 获取定义该方法的类

  3、public Object getDefaultValue()   获取该方法的默认返回值-----只对注解类中的方法有效

  4、public Type[] getExceptionTypes() 获取该方法抛出的异常类型

  5、public Class<?>[] getParameterTypes() 获取该方法的形参参数类型

public class SubClass  {

	public String testPub(String value, String value1) {
		return value1;
	}

	public static void main(String[] args) {
		try {
			Class<?> clz = SubClass.class;
			Method method = clz.getMethod("testPub", String.class, String.class);
			System.out.println(method.toGenericString());

			Class<?> returnType = method.getReturnType();
			System.out.println("方法返回值类型" + returnType.getCanonicalName());
			Class<?> declareClass = method.getDeclaringClass();
			System.out.println("该方法是哪个类定义的" + declareClass.getCanonicalName());
			Object defalutValue = method.getDefaultValue();
			System.out.println("方法返回默认值(只对注解类中方法有效)" + defalutValue);
			Class<?> throwException[] = method.getExceptionTypes();
			for (Class<?> class1 : throwException) {
				System.out.println("方法抛出的异常" + class1.getCanonicalName());
			}
			Class<?>[] parameters = method.getParameterTypes();
			for (Class<?> class1 : parameters) {
				System.out.println("方法形参类型" + class1.getCanonicalName());
			}
			boolean isAccessible = method.isAccessible();
			System.out.println("是否进行安全检查" + isAccessible);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

  运行结果:  

public java.lang.String cn.trip.core.servlet.SubClass.testPub(java.lang.String,java.lang.String)
方法返回值类型java.lang.String
该方法是哪个类定义的cn.trip.core.servlet.SubClass
方法返回默认值(只对注解类中方法有效)null
方法形参类型java.lang.String
方法形参类型java.lang.String
是否进行安全检查false
  6、public Object invoke(Object obj, Object... args)  定义该方法的类的实例 obj调用该方法,形参参数为  ... args ;   
public static void main(String[] args) {
		try {
			Class<?> clz = SubClass.class;
			SubClass sub = new SubClass();
			Method method = clz.getMethod("testPub", String.class, String.class);
			System.out.println(method.getName());
                         Object returnValue = method.invoke(sub, "A","B");
                         System.out.println("调用方法后返回值"+returnValue);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
testPub
调用方法后返回值B

  7、public Annotation[] getDeclaredAnnotations() 返回该方法上的所有注解

  8、public <T extends Annotation> T getAnnotation(Class<T> annotationClass)  获取该方法上的annotationClass类型注解



展开阅读全文
打赏
1
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部