1. 程式人生 > >Java反射獲取方法,執行方法,獲取註解

Java反射獲取方法,執行方法,獲取註解

新建Person類:

package test.reflection.cal;

import test.reflection.annotation.AnnoTest;

/**
 * 用於測試反射的類
 * @author Administrator
 *
 */
public class Person {
	
	private int id;
	private String name;
	
//	public Person(){}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * 待測試的方法  
	 * private 修飾 
	 *  帶註解
	 * @param i
	 * @return
	 */
	@AnnoTest(value = "what",name = "are you doing")
	private String changeInfo(String i){
		return i+"  "+name;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + "]";
	}
	
	

}


新建註解:

package test.reflection.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 自定義註解
 * @author Administrator
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
	
	String name() default "this is an annotation";

	String value() default "";

}


測試類:

package test.reflection.test;

import java.lang.reflect.Method;

import test.reflection.annotation.AnnoTest;
import test.reflection.cal.Person;

/**
 * 反射測試
 * 
 * @author Administrator
 *
 */
public class ReflectionTest {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Throwable, SecurityException {

		Person p = new Person();
		Class<Person> clazz = (Class<Person>) p.getClass();
		// 獲取所有的方法
		Method[] methods = clazz.getDeclaredMethods();
		System.out.println("Person 的所有方法:");
		for (Method method : methods) {
			System.out.println("" + method.getName());
		}
		System.out.println();
		// 獲取getName方法,沒有賦初值,結果為null 
		Method m0 = clazz.getDeclaredMethod("getName");
		System.out.println("getName:  " + m0.invoke(p));
		// 獲取setName方法
		Method mset = clazz.getDeclaredMethod("setName", String.class);
		mset.invoke(p, "dam");

		System.out.println("setName之後  " + p.toString());
		// 獲取changeInfo 方法
		Method m1 = clazz.getDeclaredMethod("changeInfo", String.class);
		m1.setAccessible(true);// changeInfo方法用private修飾 ,這裡需要設定為true才能獲取
		String res = (String) m1.invoke(p, " haha");
		System.out.println("changeInfo:" + res);

		// 獲取changeInfo 方法上的註解
		AnnoTest annoTest = (AnnoTest) m1.getAnnotation(AnnoTest.class);
		System.out.println(annoTest.name());// 獲取註解中的值
		System.out.println(annoTest.value());// 獲取註解中的值

	}
}


相關推薦

Java反射獲取方法執行方法獲取註解

新建Person類: package test.reflection.cal; import test.reflection.annotation.AnnoTest; /** * 用於測試反射的類 * @author Administrator * */ pub

使用java反射操作類的建構函式成員變數和成員方法

在java.lang.reflect包中有三個類Field,Method,Constructor.分別描述域,方法,構造器。參考API,關於這三個類的說明。 在執行時使用反射分析物件,如果訪問的是私有域或是私有方法,私有建構函式,會丟擲IllegalAccessExce

根據物件中欄位屬性值動態java反射呼叫相應的get方法

根據物件中欄位屬性值,動態呼叫相應的get方法 #### 舉個例子,把物件GoodsVO中的欄位作為key, get方法作為value,全部存放在Map中. //商品物件 public class GoodsVO { /** * 品牌ID */

Tomcat啟動真正完成後執行方法

本文主要介紹Tomcat啟動真正完成後(即在eclipse的控制檯上出現類似於Server started in 2300ms這樣的訊息後)執行一個操作。 如下的3種方法都是在Tomcat啟動過程中執行的,這樣會影響Tomcat的啟動時間,從而造成Tomcat不能啟動成功

java反射:加載成員方法

pri ssi ID otf cati sys leg tar security java反射:加載成員方法 package com.ma.reflection; import java.lang.reflect.InvocationTargetException; i

Java反射之getFields()、getDeclaredFields()方法

在Java開發中,有兩種獲取欄位的方式:getFields()和getDeclaredFields()。 兩者區別: getFields():獲取某個類的所有的公共(public)的欄位,包括父類中的欄位 getDeclaredFields():獲取某個類的所有宣告的欄位,即包括publ

Java反射中Method類invoke方法的用法

對帶有指定引數的指定物件呼叫由此 Method 物件表示的底層方法。個別引數被自動解包,以便與基本形參相匹配,基本引數和引用引數都隨需服從方法呼叫轉換。 如果底層方法是靜態的,那麼可以忽略指定的 obj 引數。該引數可以為 null。 如果底層方法所需的形引數為

java web程式啟動自動執行方法(spring)

場景:將web專案部署到tomcat後,啟動tomcat後自動執行程式重的某個方法。 環境:spring、springmvc 直接新建一個controller類,讓該類實現ApplicationLis

java反射class的三種方式反射建立物件的兩種方式

反射中,欲獲取一個類或者呼叫某個類的方法,首先要獲取到該類的 Class 物件。 1、獲取Class物件 在 Java API 中,提供了獲取 Class 類物件的三種方法: 第一種,使用 Class.forName 靜態方法。 前提:已明確類的全路徑名。 第二種,

Hadoop詳解(二)——HDFS的命令執行過程Java介面原理詳解。RPC機制

HDFS是Hadoop的一大核心,關於HDFS需要掌握的有:分散式系統與HDFS、HDFS的體系架構和基本概念、HDFS的shell操作、Java介面以及常用的API、Hadoop的RPC機制、遠端debugDistributed  File System資料量越來越多,在一

Java反射AccessibleObject類的setAccessible方法

看下面的程式碼: public class A { private int data=0; } import Java.lang.reflect.*; public class B { public static void main(String[]

httpclient介面測試利用反射根據方法執行方法的使用示例

本人在使用httpclient做介面測試的過程中,寫了一個簡單框架,經過不斷進行封裝和優化程式碼,在昨天終於解決了困擾許久的問題。其中一個非常重要的方法就是在學了了利用java反射根據引數名執行對應方法,經過一早上的修改,基本完成了對程式碼的封裝這裡並沒有將前兩個方法封裝在

JAVA反射實現JdbcTemplate中查詢方法 返回的結果集自動封裝成對應的JAVABean對象

block ada declare object execute pla conn list() 語句 將JdbcTemplate中查詢方法返回的結果集自動封裝成對應的JAVABean對象 只能查詢單張表的數據 封裝到對應的JAVABean對象中 查詢的列數隨意 可以不

基於CentOS 6 系統創建邏輯卷LVM執行擴容縮減刪除等操作

靈活 硬盤 erl borde pan local lock 地址 擁有 基於CentOS 6 系統創建邏輯卷LVM,執行擴容,縮減,刪除等操作 2016-08-29 05:37:57 標簽:Linux LVM Fstab VG PV 原創作品,允許轉載,轉載時請務

分發系統expect遠程登錄執行命令傳遞參數

分發系統expect遠程登錄 執行命令自動退出 傳遞參數 分發系統:shell 上線腳本expect實現遠程傳輸文件,執行命令,系統上線等功能expect 腳本遠程登錄vim 1.expect#! /usr/bin/expectset host "192.168.91.129"

Centos環境下執行gulp顯示執行成功但找到不生成的壓縮文件

cat 大寫 div pip 沒有 span 找到 code root 舉例來說:以下是css文件夾下site.css文件為site.min.css,並且將生成的文件放在指定的目錄下 //壓縮站點css gulp.task(‘appallcss‘, funct

Libgdx Developer's Guide(Libgdx開發者手冊)-7(查詢日誌執行特定平臺程式碼的介面)

查詢 應用程式介面提供了豐富的方法來查詢執行時環境的屬性。 獲取應用型別 有時,對一些特殊案例來說,很有必要依賴於它所執行的平臺而編寫部分應用。Application.getApplicationType() 方法返回當前應用程式正在使用的平臺。  switch(Gdx

關於程序執行多程序和多執行緒的網路程式設計

程序執行緒網路 多工程式設計 : 可以有效的利用計算機資源,同時執行多個任務 程序 : 程序就是程式在計算機中一次執行的過程 程序和程式的區別: 程式是一個靜態檔案的描述,不佔計算機的系統資源 程序是一個動態的過程,佔有cpu記憶體等資源,有一定的生命週期 * 同一個程式的不同執行過程即為不同的程序

一行程式碼可以幹什麼執行之後這位程式設計師要跑路了

一款貪吃蛇遊戲,大概需要20行左右的程式碼,哪怕是一個最簡單的web頁面,也需要多行程式碼才能實現,但下面這位小夥子,卻成功的使用一行程式碼,刪除了公司的資料庫,甚至連備份檔案,都刪得乾乾淨淨,算是從刪庫到跑路的典型了。   一名叫Marco Marsala的程式設計師,是一

併發執行程序

一個是實力的體現,一個是商用的必須需求。 以往: windows: CreatThread(),_beginthred(),_beginthredexe() Linux: pthread_create() 建立執行緒 臨界區,互斥量。以往多執行緒程式碼不能跨平臺。 從C++11開始,C+