---------------------- 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培训、期待与您交流! ----------------------