---------------------- android培訓、java培訓、期待與您交流! ----------------------
8.反射調用main方法之從配置文件中讀取類名(6.4練習深入):
//讀取文件相對於工程目錄,配置文件放在工程目錄下
//InputStream is=new FileInputStream("src/config.properties");
//讀取文件相對於當前類,即InvokeMain.class所在目錄
//InputStream is=InvokeMain.class.
getResourceAsStream("config.properties");
//讀取文件相對於bin下得目錄,即classpath所在目錄
InputStream is=InvokeMain.class.getClassLoader().
getResourceAsStream("cn/itcast/day1/config.properties");
Properties pro=new Properties();
pro.load(is);
is.close();
String className=pro.getProperty("name");
Method main1=
Class.forName(className).getMethod("main",String[].class);
main1.invoke(null,new Object[]{new String[]{"ddd","ewew"}});
注意:以上3種方法加載配置文件時,配置文件在不同的目錄下。
9.註解相當於一種標記,在程序中加了註解就等於爲程序打上了某種標記,沒加,則等於沒有某種標記,以後,javac編譯器,開發工具和其他程序可以用反射來了解你的類及各種元素上有無何種標記,看你有什麼標記,就去幹相應的事。標記可以加在包,類,字段,方法,方法的參數以及局部變量上。
@Override 用在方法上,表示這個方法是重寫的父類的方法。假如這個方法沒有重寫父類方法,則報錯。
@Deprecated 用來標記類、字段、方法等,表示這個對象已經過時。當其他程序引用這個對象時,IDE一般會出項相應提示。
@SuppressWarnings(value="unchecked") 被此註釋標記的元素不會出現提示信息。
如:@SuppressWarnings(value="unchecked")
List<String> list=new ArrayList();
用命令行編譯時,不會出現提示信息。假如註釋掉
@SuppressWarnings(value="unchecked"),用命令行編譯時會出項如下提示信息:
注意:hello.java 使用了未經檢查或不安全的操作。
注意:要了解詳細信息,請使用 -Xlint:unchecked 重新編譯。
注:用eclipse編輯程序時,無論註釋與否,都出現提示信息。
10.簡單的自定義註釋示例:
註釋定義:
public @interface MetaAnnotation {
String value();}
註釋的定義相當於接口的定義,它繼承了Annotation類。以方法的形式定義成員變量。
註釋應用:
public class Test{
@MetaAnnotation(value="xx")
//當註釋只有一個變量需要或者其他變量有默認值時,也可@MetaAnnotation("xx")
public void func(){}
}
11.複雜註釋定義及反射:
定義:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itcast.day1.EnumTest;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
String color() default "blue";//設置默認值
String value();
int[] arrayAttr() default {3,4,4};
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");
}
應用1:
註釋相當於一個類,但是它不能實例化。註釋修飾類或者類中的某個成分時,就相當於產生了一個該註釋的對象,然後可以通過反射方式得到這個對象,再用對象調用方法的形式得到成員變量的值。
A getAnnotation(Class<A> annotationClass)
如果存在該元素的指定類型的註釋,則返回這些註釋,否則返回 null。
Annotation[] getAnnotations() 返回此元素上存在的所有註釋。
boolean isAnnotationPresent(Class annotationClass)
如果指定類型的註釋存在於此元素上,則返回 true,否則返回 false。
import java.lang.reflect.Method;
@ItcastAnnotation("class AnnotationTest1'value")
public class AnnotationTest1 {
// 其他成員變量也賦值時,賦值形式都用鍵值對。
public static void main(String[] args) throws Exception {
//類註釋反射
if(AnnotationTest1.class.isAnnotationPresent
(ItcastAnnotation.class)) {
ItcastAnnotation anno = AnnotationTest1.class.
getAnnotation(ItcastAnnotation.class);
System.out.println(anno.value());
System.out.println(anno.color());
}
//方法註釋反射
//假如原方法沒有參數,第二個參數就不需要
Method m = T.class.getMethod("function", String.class); ItcastAnnotation itAnno =
m.getAnnotation(ItcastAnnotation.class);
if(itAnno!=null){
System.out.println(itAnno.value());
System.out.println(itAnno.array().length);}
}
}
class T {
@ItcastAnnotation(value = "class T'value",
color = "yellow", array = { 3,2, 1 })
public static void function(String str) {
}
}
---------------------- android培訓、java培訓、期待與您交流! ----------------------