java反射怎麼用
1. java課程分享Java的反射機制
Java反射機制是一個非常強大的功能,在很多大型項目比如Spring,Mybatis都可以看見反射的身影。通過反射機制我們可以在運行期間獲取對象的類型信息,利用這一特性我們可以實現工廠模式和代理模式等設計模式,同時也可以解決Java泛型擦除等令人苦惱的問題。下面java課程http://www.kmbdqn.com/就從實際應用的角度出發,來應用一下Java的反射機制。
反射基礎
p.s:本文需要讀者對反射機制的API有一定程度的了解,如果之前沒有接觸過的話,建議先看一下官方文檔的QuickStart。
在應用反射機制之前,首先我們先來看一下如何獲取一個對象對應的反射類Class,在Java中我們有三種方法可以獲取一個對象的反射類。
通過getClass方法
在Java中,每一個Object都有一個getClass方法,通過getClass方法我們可以獲取到這個對象對應的反射類:
Strings="ziwenxie";
Class<?>c=s.getClass();
通過forName方法
我們也可以調用Class類的靜態方法forName:
Class<?>c=Class.forName("java.lang.String");
使用.class
或者我們也可以直接使用.class:
Class<?>c=String.class;
獲取類型信息
在文章開頭我們就提到反射的一大好處就是可以允許我們在運行期間獲取對象的類型信息,下面我們通過一個例子來具體看一下。
首先我們在typeinfo.interfacea包下面新建一個介面A:
packagetypeinfo.interfacea;
publicinterfaceA{voidf();}
接著我們在typeinfo.packageaccess包下面新建一個介面C,介面C繼承自介面A,並且我們還另外創建了幾個用於測試的方法,注意下面幾個方法的許可權都是不同的。
2. Java反射invoke怎麼用
Java反射中invoke的用法,我給你個例子,你看看吧(每一句都有注釋)
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
public class S{
public void test(){
System.out.println("test");
}
public static void main(String[] args) throws Exception {
//獲取S類
Class clzz = Class.forName("S");
//獲取S類默認無參構造方法
Constructor con = clzz.getDeclaredConstructor();
//創建一個S類實例對象
S s =(S)con.newInstance();
//獲取S類的公有成員方法test
Method m=clzz.getDeclaredMethod("test");
//調用S類對象s中的公有成員方法test
m.invoke(s);
}
}
3. java中什麼是反射,反射怎麼用,什麼場景用有沒有替代方案
1、反射簡言之就是在編譯時無法拿到某一個類,但是可以在運行時動態獲取這個類,這樣去使用某一個類,就是反射的使用場景。
2、代替反射或者類似的操作,可以通過DI實現IOC .依賴注入,動態代理。
4. java的反射技術有什麼用
一、反射的概述
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的位元組碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼文件對應的Class類型的對象.
以上的總結就是什麼是反射
反射就是把java類中的各種成分映射成一個個的Java對象
例如:一個類有:成員變數、方法、構造方法、包等等信息,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個對象。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)
如圖是類的正常載入過程:反射的原理在與class對象。
熟悉一下載入的時候:Class對象的由來是將class文件讀入內存,並為之創建一個Class對象。
希望對您有所幫助!~
5. java中的反射怎麼用
首先應該說 反射機制提供的功能是很強大的 但是客觀性和維護性很差
一般反射用在 構造框架 以及工具開發等等
但是實際開發軟體運用的並不多
下面是一個簡單的例子
package com.wqx.test4;
public class Test {
public void sayhello(String name)
{
System.out.println("hello:"+name);
}
public static void main(String[] args) {
try {
//把test 這個類載入內存
Class c=Class.forName("com.wqx.test4.Test");
//創建這個類的實例
Object obj=c.newInstance();
//通過class來取得這個方法對象 並且聲明 這個類的參數類型
java.lang.reflect.Method method=c.getMethod("sayhello", Class.forName("java.lang.String"));
//invoke 來執行方法對象 記得參數類型要跟這里的參數匹配
method.invoke(obj, "wqx");
} catch (Exception e) {
// TODO: handle exception
}
}
}
6. java中反射的三種方法是
第一種:通過forName()方法;
第二種:類.class;
第三種:對象.getClass()。
舉例如下:
package
test;
public class Demo{
public static void
main(){
Class<?> c1 = null;
Class<?> c2 =
null;
Class<?> c3 =
null;
//三種反射用實例化方式
try{
//最常用的一種形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通過Object類中的方法實例化
c2
= new X().getClass();
//通過類.class實例化
c3 =
X.class;
System.out.println("類名:" + c1.getName());
//得到類名
System.out.println("類名:" + c2.getName());
//得到類名
System.out.println("類名:" + c3.getName());
//得到類名
}
}
7. java反射的作用。
1. Java反射包reflection提供對Class,Method,field,constructor1 等信息的封裝類型。
2. 通過這些api可以輕易獲得一個類的各種信息並且可以進行實例化,方法調用等。
類中的private參數可以通過setaccessible方法強制獲取。
3. 反射的作用可謂是博大精深,JDK動態代理生成代理類的位元組碼後,首先把這個類通過defineclass定義成一個類,然後用class.for(name)會把該類載入到jvm,之後我們就可以通過,A.class.GetMethod()獲取其方法,然後通過invoke調用其方法,在調用這個方法時,實際上會通過被代理類的引用再去調用原方法。