1. 利用注释和反射 实现程序的方法按顺序执行
====================
2. 注释的属性的写法,与使用
-----------------
==============
3. 利用注释及其属性来调用这个类中的方法
--------------
Order.java
----
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
int value();
}
-----
Tarena.java
public class Tarena {
@Order(1)
public void studyUnix(){
System.out.println("Unix");
}
@Order(8)
public void studyEJB(){
System.out.println("EJB");
}
@Order(2)
public void studyCoreCpp(){
System.out.println("C++");
}
@Order(3)
public void studyUnixCpp(){
System.out.println("Unix C++");
}
@Order(6)
public void studyHibernate(){
System.out.println("Hibernate");
}
@Order(5)
public void studyJDBC(){
System.out.println("JDBC");
}
@Order(7)
public void studyJavaWeb(){
System.out.println("Servlet JSP Struts");
}
@Order(4)
public void studyCoreJava(){
System.out.println("CoreJava");
}
}
------
RunByOrder.java
import java.lang.reflect.*;
import java.util.*;
public class RunByOrder {
public static void main(String[] args) throws Exception{
Class c=Class.forName("Tarena");
Object o=c.newInstance();
TreeMap tm=new TreeMap();
Method[] ms=c.getMethods();
for(Method m:ms){
if (m.isAnnotationPresent(Order.class)){
Order order=m.getAnnotation(Order.class);
int value=order.value();
tm.put(value,m);
}
}
Set s=tm.keySet();
for(Integer i:s){
Method m=tm.get(i);
m.invoke(o);
}
}
}
====================
2. 注释的属性的写法,与使用
-----------------
Test.java
import java.lang.annotation.*;
@Target(value={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
String parameter() default "liucy";
}
/*
*@interface A1{
* A2[] value();
*}
*@interface A2{
* String[] value();
*}
*@A1({@A2({"A","B"}),@A2({"C","D"})})
*public void m(){}
*
*
*
*/
-----------
MyClass.java
public class MyClass {
//要测 参数:"liucy"
@Test
public void m1(String s){
System.out.println(s+" m1");
}
public void m2(String s){
System.out.println(s+" m2");
}
//要测 参数:"tangliang"
@Test(parameter="tangliang")
public void m3(String s){
System.out.println(s+" m3");
}
}
--------------
Test1.java
public class Test1 {
public static void main(String[] args) {
MyClass mc=new MyClass();
mc.m1("liucy");
mc.m3("tangliang");
}
}
==============
3. 利用注释及其属性来调用这个类中的方法
--------------
TestEngin.java
import java.lang.reflect.*;
public class TestEngine {
public static void main(String[] args) throws Exception{
//构造对象
String className="MyClass2";
Class c=Class.forName(className);
Object o=c.newInstance();
//获得方法对象
Method[] ms=c.getMethods();
for(Method m:ms){
//判断Test注释在这个方法上是否存在
if (m.isAnnotationPresent(Test.class)){
//获得Test注释对象
Test t=m.getAnnotation(Test.class);
//获得Test注释的parameter属性
String p=t.parameter();
//调用这个方法
m.invoke(o,p);
}
}
}
}
-------------
Test.java
import java.lang.annotation.*;
@Target(value={ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
String parameter() default "liucy";
}
/*
*@interface A1{
* A2[] value();
*}
*@interface A2{
* String[] value();
*}
*@A1({@A2({"A","B"}),@A2({"C","D"})})
*public void m(){}
*
*
*
*/
------------
MyClass.java
public class MyClass2 {
@Test(parameter="Hiloo")
public void p1(String s){
System.out.println("p1 "+s);
}
@Test(parameter="Chenzq")
public void p2(String s){
System.out.println("p2 "+s) ;
}
}