『壹』 如何利用java反射構造一個類,使之實現一個介面和一些功能
可以實現,很方便。我去找個例子貼給你
Class FactoryClass = Class.forName(Name);
//Name是DAOFactory實現類的名字
// types of the constructor arguments
Class[] constrArgs = {Properties.class};
Object[] args = {Props};
//Props是Properties類型,它的內容來自一個配置文件
// get Constructor of this class with matching parameter types
Constructor<IDAOFactory> constructor = FactoryClass.getConstructor(constrArgs);
this.factory = constructor.newInstance(args);
『貳』 java中,如果一個方法A的參數是一個介面,那在主方法中怎麼調用這個方法
你需要抄創建一個類,實襲現 Bsur 介面,然後創建這個類的一個實例,傳給 show 方法,例如:
classAAimplementsBsur{
//實現Bsur介面的sub方法
publicvoidsub(){
System.out.println("我是sub方法。");
}
}
創建 AA 實例,傳給 show 方法。
AAaa=newAA();
x.show(aa);
『叄』 java反射調用方法可以傳非基本類型嗎如對象、介面
可以的,參數類型是沒有限制的。通過以下代碼可以證明。
介面:
publicinterfaceMyInterface{
voidprint();
}
實現類:
{
@Override
publicvoidprint(){
System.out.println("interfaceImpl");
}
}
通過反射調用方法:
importjava.lang.reflect.Method;
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
Testinstance=Test.class.newInstance();
Methodmethod=Test.class.getDeclaredMethod("test",MyInterface.class);
MyInterfacemyInterface=newMyInterfaceImpl();
method.invoke(instance,myInterface);
}
publicvoidtest(MyInterfacemyInterface){
myInterface.print();
}
}
『肆』 如何利用java反射,獲取屬性介面的具體類
你可以這么寫:
class BodyImpl implements Body{
//do something
public static void main(String[] args) {
Type[] interfaces = BodyImpl.class.getInterfaces();
ParameterizedType firstInterface = (ParameterizedType) interfaces[0];
Class c = (Class) firstInterface.getActualTypeArguments()[0];
System.out.println(c.getName()); // prints "AtomEntry"
}
}
就得到你所要的回介面參數了!答
『伍』 Java 怎麼通過反射獲取並實現這個類裡面的介面,並且實現介面中的方法
獲取當前線程的ClassLoader,通過ClassLoader獲取當前工作目錄,對目錄下的文件進行遍歷掃描。過濾出以.class為後綴的類文件,並載入類到list中,對list中所有類進行校驗,判斷是否為指定介面的實現類,並排除自身。返回所有符合條件的類。
這個方沒有考慮不同的文件格式。當程序打成jar包,發布運行時,上述的這種遍歷file的操作就失效了。只能掃描到當前方法的同級目錄及其子目錄。無法覆蓋整個模塊,遍歷文件的邏輯太啰嗦,可以簡化。
(5)java反射參數為介面擴展閱讀:
Java使用注意事項:
1、如果沒有定義環境變數classpath,java啟動jvm後,會在當前目錄下查找要運行的類文件。
2、如果指定了classpath,那麼會在指定的目錄下查找要運行的類文件。
3、PATH環境變數。作用是指定命令搜索路徑,在命令行下面執行命令如javac編譯java程序時,它會到PATH變數所指定的路徑中查找看是否能找到相應的命令程序。
4、需要把jdk安裝目錄下的bin目錄增加到現有的PATH變數中,bin目錄中包含經常要用到的可執行文件如javac/java/javadoc等待,設置好PATH變數後,就可以在任何目錄下執行javac/java等工具了。
『陸』 如何生成內部hide介面實例並通過反射作為參數進行傳遞
一、前言
在android系統源碼中,有很多的api是隱藏的,在eclipse中通過sdk是無法訪問到的。這些api有的是整個類/介面、有的是某個具體的方法、或者變數,在源碼中通過文檔注釋內的「@hide」字元進行標識。如果我們需要去訪問這些被hide的方法、類,可以採用如下兩種方式:
1、在源碼環境下進行訪問,即將我們的工程放到源碼下進行編譯,這樣是可以訪問的;
2、通過java的反射機制
二、場景描述
這里講述的是在eclipse下直接通過反射機制來訪問系統隱藏api。舉例如下:
android.app.ActivityManagerNative類定義了一個setActivityController(IActivityController watcher)方法,該方法通過參數IAcitivityController設置一個監聽器,用來監聽系統啟動某個Activity。當系統啟動某個Activity時,會調用IAcitivityController的回調方法。
在工程中可以通過獲取ActivityManagerNative對象並生成一個IActivityController實例作為setActivityController()的參數傳遞過去,從而達到在工程中監聽到系統Activity的啟動。
ActivityManagerNative.java和IAcitivityController.aidl均為hide api,如下:
[java] view plain
package android.app;
/** {@hide} */
public abstract class ActivityManagerNative extends Binder implements IActivityManager{
/**
* Retrieve the system's default/global activity manager.
*/
static public IActivityManager getDefault() {
return gDefault.get();
}
public void setActivityController(IActivityController watcher) throws RemoteException{}
}
package android.app;
import android.content.Intent;
/**
* Testing interface to monitor what is happening in the activity manager
* while tests are running. Not for normal application development.
* {@hide}
*/
interface IActivityController
以上類都有「@hide」標識,所以需要通過反射的機制來進行訪問。ActivityManagerNative對象可通過反射和該類的靜態方法getDefault()獲取到,再通過setActivityController方法設置監聽器。但IActivityController也是內部hide aidl文件,如何繼承該介面並實例化呢?
解決方案:把系統內的IActivityController.aidl文件在我們自己的工程里按照同樣的包結構創建一份,在程序中繼承該介面,在調用setActivityController時傳入該實例即可。
三、實現過程
1、拷貝系統內IActivityController.aidl到工程中,與系統內該文件包結構保持一致:
2、程序中實現該介面:
[java] view plain
private class ActivityController extends IActivityController.Stub {
public boolean activityStarting(Intent intent, String pkg) {
return true;
}
public boolean activityResuming(String pkg) {
return true;
}
public int appEarlyNotResponding(String processName, int pid,
String annotation) {
return 0;
}
public boolean appCrashed(String processName, int pid, String shortMsg,
String longMsg, long timeMillis, String stackTrace) {
return false;
}
public int appNotResponding(String processName, int pid,
String processStats) {
return 0;
}
}
3、通過反射獲取ActivityManagerNative對象並調用方法setActivityController進行監聽器設置:
[java] view plain
private void setActivityController() {
try {
Class<?> cActivityManagerNative = Class
.forName("android.app.ActivityManagerNative");
Method mGetDefault = cActivityManagerNative.getMethod("getDefault",
null);
Object oActivityManagerNative = mGetDefault.invoke(null, null);
Class<?> i = Class.forName("android.app.IActivityController$Stub");
Method mSetActivityController = cActivityManagerNative.getMethod(
"setActivityController",
Class.forName("android.app.IActivityController"));
mSetActivityController.invoke(oActivityManagerNative,
new ActivityController());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
『柒』 java類的構造函數的參數為介面類型,如何傳值
傳入的參數可以是實現了Interface B的類~~~
例如~Class C implements B~
那麼 new A(new C());是可以的~
『捌』 java中方法的參數可以是介面嗎
可以,java方法的參數支持基本數據類型、對象、介面
『玖』 請問利用Java反射實現一個類中的介面是如何實現的呢
在理解反射的時候,不得不說一下內存。
先理解一下JVM的三個區:堆區,棧區,和方法去(靜態區)。
堆區:存放所有的對象,每個對象都有一個與其對應的class信息。在JVM中只有一個堆區,堆區被所有的線程共享。
棧區:存放所有基礎數據類型的對象和所有自定義對象的引用,每個線程包含一個棧區。每個棧區中的數據都是私有的,其他棧不能訪問。
棧分為三部分:
基本類型變數區、執行環境上下文、操作指令區(存放操作指令)。
方法區:即靜態區,被所有的線程共享。方法區包含所有的class和static變數。它們都是唯一的。
在啟動一個java虛擬機時,虛擬機要載入你程序里所用到的類 ,這個進程會首先跑到jdk中(在jdk的jre/lib/ext文件夾里找那些jar文件),如果沒有找到,會去classpath里設置的路徑去找。
在找到要執行的類時:
1.首先將找到的類的信息載入到運行時數據區的方法區。這個過程叫做類的載入。所以一下static類型的在類的載入過程中就已經放到了方法區。所以不用實例化就能用一個static類型的方法。
2.載入完成後,在new一個類時,首先就是去方法區看看有沒有這個類的信息。如果沒有這個類的信息,先裝載這個類。then,載入完成後,會在堆區為new的這個類分配內存,有了內存就有了實例,而這個實例指向的是方法區的該類信息。其實就是存放了在方法區的地址。而反射就是利用了這一點。
『拾』 java 利用反射調用其它項目的介面..具體點。。。謝謝。。
是其他應用的么?你用webservice唄。這個需要那個應用供應商提供給你,給你的時候會帶詳細的介面文檔,裡面會說明怎麼調用,參數和返回值。