反射:
反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说是'自审',并能直接操作程序的内部属性.例如,使用它能获得Java类中各成员的名称并显示出来.
Class c = Class.forName("java.lang.String");//返回与带有给定字符串名的类或接口相关联的 Class 对象,中间的参数是一个类的全部路径;
Method ms[] = c.getDeclaredMethods();//返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认、访问和私有方法,但不包括继承的方法.
例子:
import java.awt.Button;
import java.lang.reflect.Method;
import java.util.Hashtable;
public class ReflectionTest {
/** *//**
* @param args
*/
public static void main(String[] args) throws Exception {
ReflectionTest reflection = new ReflectionTest();
reflection.getNameTest();
System.out.println("");
reflection.getMethodTest();
}
/** *//**
* Class的getName()方法测试
* @throws Exception
*/
public void getNameTest() throws Exception {
System.out.println("===========begin getNameTest============");
String name = "amigo";
Class cls = name.getClass();
System.out.println("string class name: " + cls.getName());
Button btn = new Button();
Class btnClass = btn.getClass();
System.out.println("button class name: " + btnClass.getName());
Class superBtnClass = btnClass.getSuperclass();
System.out.println("super button class name: " + superBtnClass.getName());
Class clsTest = Class.forName("java.awt.Button");
System.out.println("clsTest name: " + clsTest.getName());
System.out.println("===========end getNameTest============");
}
/** *//**
* Class的getMethod()方法测试
* @throws Exception
*/
public void getMethodTest() throws Exception {
System.out.println("===========begin getMethodTest==========");
Class cls = Class.forName("ReflectionTest");//返回与带有给定字符串名的类或接口相关联的 Class 对象
Class ptypes[] = new Class[2];
ptypes[0] = Class.forName("java.lang.String");
ptypes[1] = Class.forName("java.util.Hashtable");
Method method = cls.getMethod("testMethod", ptypes);
/*返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
* 。name 参数是一个 String,用于指定所需方法的简称。
* parameterTypes 参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。
* 如果 parameterTypes 为 null,则按空数组处理。*/
Object args[] = new Object[2];
args[0] = "hello, my dear!";
Hashtable ht = new Hashtable();
ht.put("name", "amigo");
args[1] = ht;
String returnStr = (String) method.invoke(new ReflectionTest(), args);
/* new ReflectionTest()表示要反射的对象 args 表示该对象方法要传递的参数 */
System.out.println("returnStr= " + returnStr);
System.out.println("===========end getMethodTest==========");
}
public String testMethod(String str, Hashtable ht) throws Exception {
String returnStr = "return str";
System.out.println("begin testMethod invoked");
System.out.println("str= " + str);
System.out.println("name= " + (String) ht.get("name"));
System.out.println("end testMethod invoked");
return returnStr;
}
}
instance:
boolean f =c.isInstance(String.class);//用于查看c是不是String类型的,返回一个bool值
try {
Class cls = Class.forName("java.lang.String");
Object arr = Array.newInstance(cls,10);//创建一个具有指定的组件类型和长度的新数组
Array.set(arr,5, "this is a test"); //设置数组的第五个元素是"this is a test"
String s = (String) Array.get(arr, 5); //获取arr的第五个元素
System.out.println(s);
} catch (ClassNotFoundException e) {
e.printStackTrace();
int a[] = new int[]{1,2,3}; 与 int a[] ={1,2,3}; 效果一样
运用反射机制获得一个Class的几种方法:
1 Class c = 类名.class;
2 Class c = Class.forName("java.lang.String");//参数是一个类的全部路径
3 Class c= 对象名.getClass();
然后就可以用这个类c 来获取该类的方法:
Method m = c.getMethod("test", null);//test是那个类的一个方法,null是该类的参数这个参数是空
再接着可以使用m的一些方法:
如:
Object ob= m.invoke(new TestHelloWorld(), null);//执行TestHelloWorld对象的test方法,成功则返回test的执行结果
TestAnnotion ta = m.getAnnotation(TestAnnotion.class);//获取该方法上面的Annotation
java 注解:annotation
@Override:
这个注解的作用是标识某一个方法是否正确覆盖了它的父类的方法.可以用来避免写代码的时候疏忽大意,导致无谓的错误.
@Deprecated:
这个注解的作用是:表示已经不建议使用这个类成员了.
@SuppressWarnings
这个注释的作用是:抑制警告信息