JAVA SE 相关

来源:互联网 发布:樱井知香 下马番号 编辑:程序博客网 时间:2024/05/21 09:07

反射:

   反射(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

   这个注释的作用是:抑制警告信息