`

lang.reflect->java.lang.reflect.Method

阅读更多
java中反射使用几率最多的就是方法的反射。
功能支持的类库:java.lang.reflect.Method

提供的功能包括:
1、获取方法上的注解信息。(getAnnotations、getDeclaredAnnotations)
2、获取方式上的某个注解信息Annotation。(getAnnotation(Type.class))
3、获取方法上的类型参数Type。(getTypeParameters)
4、获取方式声明的异常类型Class[]。(getExceptionTypes)
5、获取方式上的参数注解。(getParameterAnnotations)
6、获取方法返回的数据类型Class。(getReturnType)
7、获取方法方法的参数类型Class[](getParameterTypes)
8、执行某个方法(invoke(Object obj, Object... args))

以上功能是使用最频率最多的方法,请结合案例仔细体会之!

测试案例:

package array;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE,ElementType.CONSTRUCTOR })
@interface Note {
    public boolean require() default true;
    public String note() default "";
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE,ElementType.CONSTRUCTOR })
@interface Type {
    public boolean require() default true;
    public String type() default "";
}

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE,ElementType.CONSTRUCTOR })
@interface Face {
    public boolean require() default true;
    public String face() default "";
}

interface IB{
    @Face(face="method->face")
    public boolean loginUser(String username,String password) throws RuntimeException,SQLException;
}

@Note(note= "calss->B",require = false)
public class B implements IB{
    @Note(note="field->note")
    @Type(type="field->type")
    public List<String> note = Arrays.asList("defaultValue");
    
    @Note(note="CONSTRUCTOR->B")
    public <T> B(@Note(note = "p->note") @Type(type = "p->type") String note,String note2){
    }
    
    @Note(note = "method ->login()",require = true)
    public void login(@Note(note = "p->username") String username, @Note(note = "p->password")String password) {
    }
    
    @Note(note = "method ->login()",require = true)
    @Type(type = "p->type->username",require = false) 
    public boolean  loginUser(@Note(note = "p->note->username") @Type(type = "p->type->username") String username, @Type(type = "p->password")String password)
    throws RuntimeException,SQLException{
      return true;
    }

    public <N,P> N getUserInfo(){
	return null;
    }
    public List<String> getNote() {
        return note;
    }

    public void setNote(List<String> note) {
        this.note = note;
    }
    
}

package array;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
/**
 * 测试方法反射方法
 * @author create by [url=xinchunwang@aliyun.com]新春.王[/url] <br> 
 *
 */
public class MethodReflect {
    public static void main(String[] args) throws Exception {
	// 获取B.class 的loginUser方法 注意参数:("loginUser", String.class,String.class)
	Method loginMethod = B.class.getMethod("loginUser", String.class, String.class);
	
	//NOTE:方法上声明的注解是无法继承的
	//获取方法上的所有注解
	Annotation[] methodAnno = loginMethod.getAnnotations();
	for(Annotation item : methodAnno) {
	    if(item instanceof Note){
		Note note = (Note)item;
		System.out.println(note);
	    }else if(item instanceof Type){
		Type type = (Type)item;
		System.out.println(type);
	    }else{
		System.out.println(item);
	    }
	}
	//获取直接在方法上的注解
	Annotation[] declareMethodAnno =loginMethod.getDeclaredAnnotations();
	for(Annotation item : declareMethodAnno) {
	    if(item instanceof Note) {
		Note note = (Note)item;
		System.out.println(note);
	    }else if(item instanceof Type){
		Type type = (Type)item;
		System.out.println(type);
	    }else {
		System.out.println(item);
	    }
	}
	System.out.println("----------------------------------");
	
	//获取方法上某个类型的注解
	Type type = (Type)loginMethod.getAnnotation(Type.class);
	System.out.println(type);
	//如果方法上没有此注解,直接返回null
	Face face = (Face)loginMethod.getAnnotation(Face.class);
	System.out.println(face);
	System.out.println(loginMethod.getDefaultValue());
	
	System.out.println("-----------------------------------------");
	//获取方法返回的类型参数列表
	Method getUserInfo = B.class.getMethod("getUserInfo");
	TypeVariable[] typeVar = getUserInfo.getTypeParameters();
	for(TypeVariable item :typeVar){
	    System.out.println(item.getName());
	    java.lang.reflect.Type[] bounds =  item.getBounds();//参数类型的 上下边界
	    System.out.println(bounds);
	}
	System.out.println(Arrays.toString(typeVar));
	
	System.out.println("-----------------------------------------");
	//获取方法返回的异常列表
	Class[] exceptions = loginMethod.getExceptionTypes();
	System.out.println(Arrays.toString(exceptions));
	
	System.out.println("-----------------------------------------");
	//获取参数的类型
	Class[] parameterTypes = loginMethod.getParameterTypes();
	System.out.println(Arrays.toString(parameterTypes));
	
	System.out.println("-----------------------------------------");
	//获取参数上的注解
	Annotation[][] parameterAnno = loginMethod.getParameterAnnotations();
	for(Annotation[] item : parameterAnno){
	    System.out.println(Arrays.toString(item));
	}
	
	System.out.println("-----------------------------------------");
	//获取返回的类型
	Class returnType = loginMethod.getReturnType();
	System.out.println(returnType);
	
	B b = new B("","");
	//执行某个方法
	boolean result =(Boolean)loginMethod.invoke(b, "","");
	System.out.println(result);
    }
}



测试输出:
@array.Note(require=true, note=method ->login())
@array.Type(require=false, type=p->type->username)
@array.Note(require=true, note=method ->login())
@array.Type(require=false, type=p->type->username)
----------------------------------
@array.Type(require=false, type=p->type->username)
null
null
-----------------------------------------
N
[Ljava.lang.reflect.Type;@5a8a0d5d
P
[Ljava.lang.reflect.Type;@1d73831b
[N, P]
-----------------------------------------
[class java.lang.RuntimeException, class java.sql.SQLException]
-----------------------------------------
[class java.lang.String, class java.lang.String]
-----------------------------------------
[@array.Note(require=true, note=p->note->username), @array.Type(require=true, type=p->type->username)]
[@array.Type(require=true, type=p->password)]
-----------------------------------------
boolean
true
分享到:
评论

相关推荐

    scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetExcep

    标题中的问题“scrcpy投屏 AssertionError: java.lang.reflect.InvocationTargetException”是用户在尝试使用Scrcpy时遇到的一个常见错误。这个错误通常意味着在执行某个方法时,Java运行时环境遇到了未预期的情况。...

    解决axis2-CodegenWizardPluginBUG- java.lang.reflect.InvocationTargetException

    `InvocationTargetException`通常作为Java标准库中的`java.lang.reflect.Method.invoke()`方法的异常包装器。当目标方法抛出异常时,`invoke()`会捕获这个异常并封装为`InvocationTargetException`,然后将其抛出。...

    Java.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    java反射 反编译:.class--&gt;.java

    例如,`java.lang.Class`类提供了获取类信息的方法,`java.lang.reflect.Field`用于访问字段,`java.lang.reflect.Method`用于调用方法,而`java.lang.reflect.Constructor`则用于操作构造器。 获取类的三种方式:...

    java反射(reflect)

    1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...

    4.反射-introdute.doc

    4. **Method类**:`java.lang.reflect.Method`代表类的方法,用于动态调用方法。例如: ```java Method method = classType.getMethod("methodName", parameterTypes...); method.invoke(object, arguments...); ...

    server frame base on c.rar

    java.lang.NullPointerException ... at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)

    jaxen.jar和dom4j.jar

    at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run...

    JAVA反射实现和实现机制

    4. **`java.lang.reflect.Method`**:表示类的方法。 5. **`java.lang.reflect.Modifier`**:提供对成员的修饰符的访问。 ##### 基本使用方法 1. **获取成员方法信息**: - `Method[] getMethods()`:获取公开的...

    java Reflection 反射机制 反编译

    import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { c = Class.forName("java.lang....

    java 反射例子 代码

    java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;

    android 奔溃日志收集 发送邮件到邮箱

    集成邮件工具类,用于发送某个应用的奔溃日志信息到邮箱。...at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:10

    ExcelExportUtils.java

    import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util....

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    其中最经常使用的是三个类:java.lang.reflect.Field类、java.lang.reflect.Method类和java.lang.reflect.Constructor类。 Java.lang.reflect.Field类提供了有关类或接口的单个域的信息。利用这个类,我们可以得到...

    javassist3.19GA.jar

    用以执行和JDK反射API中java.lang.Class,,java.lang.reflect.Method,, java.lang.reflect.Method .Field相同的操作。这些类可以使你在目标类被加载前,轻松的获得它的结构,函数,以及属性。此外,不仅仅是在功能...

    org.eclipse.jdt.core_3.5.2.v_981_R35x

    at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable....

    Java EE:Reflect 反射技术.docx

    - `java.lang.reflect.Method`:表示类的方法,提供获取方法信息和调用方法的功能。 - `java.lang.reflect.Field`:表示类的成员变量,用于获取和设置字段值。 - `java.lang.reflect.Constructor`:表示类的构造函数...

    java面试题--反射机制

    - `java.lang.reflect.Method`:表示类的方法。 - `java.lang.reflect.Field`:表示类的字段。 - `java.lang.reflect.Constructor`:表示类的构造器。 #### 五、`java.lang.Class`详解 `Class`类在Java反射机制中...

    【Java基础笔记】反射.docx

    在Java中,反射主要涉及到`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。下面将详细介绍这些知识点。 1. **反射的概述** 反射机制使得Java...

    java 反射 报错 no such method exception

    `NoSuchMethodException`属于`java.lang.reflect`包,当反射API试图查找一个指定签名的方法而该方法不存在于目标类中时,会抛出此异常。这意味着在编译时存在该方法,但在运行时却由于某种原因(如类加载问题、方法...

Global site tag (gtag.js) - Google Analytics