java反射調用一個類(java類的反射)

本文目錄一覽:

利用JAVA反射技術執行一個類的方法

public class Test {

public Test() {

}

public static void main(String[] args) throws IllegalArgumentException,

SecurityException, IllegalAccessException,

InvocationTargetException, NoSuchMethodException {

Bean bean = new Bean();

System.out.println(bean);

Bean.class.getMethod(“setName”, String.class).invoke(bean, “Jerry”);

Bean.class.getMethod(“setAge”, int.class).invoke(bean, 25);

System.out.println(“After reflection….\n” + bean);

}

}

class Bean {

private String name;

private int age;

public Bean() {

}

public Bean(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String toString() {

return “NAME: ” + this.getName() + “\nAGE: ” + this.getAge();

}

}

用java的反射機制怎麼獲取一個類中裏面方法

獲得一個類中的方法

先看一下方法和運行結果。獲取所有的方法使用Class類中getMethos()方法。

待獲取的類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

package com.aaron.reflect;

public class Heros {

private String name;//名字

private String type;//類型

private int camp;//0,近衛;1,天災

public Heros(){}

public Heros(String name, String type, int camp) {

super();

this.name = name;

this.type = type;

this.camp = camp;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public int getCamp() {

return camp;

}

public void setCamp(int camp) {

this.camp = camp;

}

@Override

public String toString() {

return “Heros [\n name=” + name + “, \n type=” + type + “, \n camp=” + camp + “\n]”;

}

}

Hero類中包含了三個屬性,和對應的getter和setter方法。另外還有一個toString方法。這是一個非常常見的pojo。

測試類:

1

2

3

4

5

6

7

8

9

10

11

12

13

package com.aaron.reflect;

import java.lang.reflect.Method;

public class Demo5 {

public static void main(String[] args) {

Class? herosClass = Heros.class;

Method[] methods = herosClass.getMethods();

for (Method method : methods) {

System.out.println(method);

}

}

}

理論上,我們會獲得所有的getter和setter,然後還有toString方法

運行結果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public void com.aaron.reflect.Heros.setType(java.lang.String)

public int com.aaron.reflect.Heros.getCamp()

public void com.aaron.reflect.Heros.setCamp(int)

public java.lang.String com.aaron.reflect.Heros.toString()

public java.lang.String com.aaron.reflect.Heros.getName()

public void com.aaron.reflect.Heros.setName(java.lang.String)

public java.lang.String com.aaron.reflect.Heros.getType()

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 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()

然而卻列出了這麼一大堆。

仔細看一下返回的方法,原來把Object類所擁有的方法也返回了。因為我們這個POJO類默認繼承的是java.lang.Object類。,例如getClass(),equals()這些。

使用getMethods()這個方法,返回了一個包含某些Method對象的數組,Method對象已經介紹過,用來表示一個方法的對象,是對類中方法進行抽象的結果。

這些對象反映了Class對象所表示的類或者接口,當然,包括那些由該類或者接口聲明的以及從超類和超接口繼承的那些類或接口。舉個例子來解釋一下:

例如使用getMethods()獲得Integer類的方法,會把Integer的父類,Number的所有方法,以及Number的父類Object的方法都獲取出來。

這個返回數組,包括了從Object類繼承的所有(公共)member方法。返回數組中的元素沒有排序。如果這個Class對象表示沒有公共成員方法的類或者接口,或者表示了一個基本類型或者表示void,則返回長度為0的數組。

2,調用類中的方法

直接給出一個Demo,注意參數。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package com.aaron.reflect;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class Demo5 {

public static void main(String[] args) {

Class? herosClass = Heros.class;

try {

Method m1 = herosClass.getMethod(“setName”,String.class);

Method m2 = herosClass.getMethod(“getName”);

Object userInfo = herosClass.newInstance();

m1.invoke(userInfo,”影魔”);

System.out.println(“調用set方法:”+userInfo);

System.out.println(“調用get方法:”+m2.invoke(userInfo));

} catch (Exception e) {

e.printStackTrace();

}

}

}

運行結果:

1

2

3

4

5

6

7

8

調用set方法:

Heros [

name=影魔,

type=null,

camp=0

]

調用get方法:

影魔

java中,用反射方式調用一個類中的main方法

Main方法是用static修飾的,有2種方法可以調用

1.類名.main(參數);

2.new創建實例,實例.main(參數);

這個地方注意必須傳遞字符串數組的參數 或者 null !

另外舉一個用反射機制調用Main方法的例子

這個類是被調用的main方法類:

Java代碼

public class Run

{

public static void main(String[] args)

{

String str=args[0]+”Hello World”;

System.out.println(str);

}

}

下面是調用main方法的類:

Java代碼

public class JobRun

{

public static void main(String[] args)

{

String idStr = “YAya”;

try

{

Method method = Run.class.getMethod(“main”, String[].class);

method.invoke(null, (Object) new String[] { idStr });

}

catch (Exception e)

{

e.printStackTrace();

}

}

}

利用JAVA反射技術執行一個類

import java.lang.reflect.InvocationTargetException;

public class SimRef {

public SimRef() {

}

public static void main(String[] args) throws IllegalArgumentException,

SecurityException, IllegalAccessException,

InvocationTargetException, NoSuchMethodException {

Bean bean = new Bean();

System.out.println(bean);

Bean.class.getMethod(“setName”, String.class).invoke(bean, “Jerry”);

Bean.class.getMethod(“setAge”, int.class).invoke(bean, 25);

System.out.println(“After reflection….\n” + bean);

}

}

class Bean {

private String name;

private int age;

public Bean() {

}

public Bean(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String toString() {

return “NAME: ” + this.getName() + “\nAGE: ” + this.getAge();

}

}

java反射的作用。

1.可以通過反射機制發現對象的類型,發現類型的方法/屬性/構造器

2.可以創建對象並訪問任意對象方法和屬性

java 通過反射 調用D盤中的類 這怎麼實現?(要代碼)

//fileName是你的java文件路徑

//先編譯java文件為class文件

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);

Iterable units = fileMgr.getJavaFileObjects(fileName);

CompilationTask t = compiler.getTask(null, fileMgr,null, null, null, units);

t.call();

fileMgr.close();

//反射來加載class文件,假設你的類為A,最好寫個接口B,讓A 實現這個接口

B a = (B)Class.forName(“包名.A”);

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/239712.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:18
下一篇 2024-12-12 12:18

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論