java新特性(反射和注记)

来源:互联网 发布:南方策略优化基金净值 编辑:程序博客网 时间:2024/05/29 12:07

(反射)ReflectionJava 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"",并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。

  

1.认识我吧:Class
  每当一個类被载入时,JVM就自动为其生成一个Class对象,通过操作class对象,我们可以得到该对象的所有成员并操作它
public class ClassDemo {
    public static void main(String[] args) {       
                  String name = “china";
        Class stringClass = name.getClass();
        System.out.println("getName: " +  stringClass.getName());
        System.out.println("isInterface: " +  stringClass.isInterface());
        System.out.println("isPrimitive: " +  stringClass.isPrimitive());
        System.out.println("isArray: " + stringClass.isArray());
        System.out.println("SuperClass: "+ stringClass.getSuperclass().getName());
              }
}
2. 如何得到Class对象
下面就是获得一个 Class 对象的方法之一:
Class c = Class.forName("java.lang.String");
  这条语句得到一个 String 类的类对象。还有另一种方法,如下面的语句:
Class c = int.class;
  或者
Class c = Integer.TYPE;
3. 动态加载类,Class.forName()方法
  每当一個类被载入时,JVM就自动为其生成一个Class对象
 public class ClassDemo {
    public static void main(String[] args) {
  Class c=Class.forName(com.cn.Test);
               c.newInstance();
            }
 }
4. java.lang. Package
          package com.bird;
          import java.util.ArrayList;
          import java.lang.Package;
          public class Demo{
       public static void main(String args[]) throws Exception{
       Demo d=new Demo();
       d.get("java.net.InetAddress");
       }
              /*
                *参数为类的名字(包名.类名)
                 */
      public void get(String args) throws Exception{
      Class c=Class.forName(args);
      Package p=c.getPackage();
      System.out.println(p.getName());
       }
      }
5. java.lang.reflect.Field
          package com.bird;
          import java.util.ArrayList;
          import java.lang.Package;
          public class Demo{
       public static void main(String args[]) throws Exception{
       Demo d=new Demo();
       d.get("java.net.InetAddress");
       }
      public void get(String args) throws Exception{
Class c=Class.forName(args);
Field []f=c.getFields(); //得到类中所有的字段
for(Field field : f){
             System.out.println(field.getName());
}
      }         
          }
6. java.lang.reflect. Modifier
          package com.bird;
          import java.lang.Modifier;
          public class Demo{
       public static void main(String args[]) throws Exception{
       Demo d=new Demo();
       d.get("java.net.InetAddress");
       }
      public void get(String args) throws Exception{
      Class c=Class.forName(args);
             int m=c.getModifiers();
             System.out.println(Modifier.toString(m));
                }         
           }

7. java.lang.reflect. Constructor
          package com.bird;
          import java.lang.Modifier;
          public class Demo{
       public static void main(String args[]) throws Exception{
       Demo d=new Demo();
       d.get("java.net.InetAddress");
       }
      public void get(String args) throws Exception{
      Class c=Class.forName(args);
             Constructor[] co=c.getConstructors(); //得到构造器
             for(Constructor con:co){
         System.out.println(con);
    }              
                  }         
           }
8. java.lang.reflect. Method
          package com.bird;
          import java.lang.Modifier;
          public class Demo{
       public static void main(String args[]) throws Exception{
       Demo d=new Demo();
       d.get("java.net.InetAddress");
       }
      public void get(String args) throws Exception{
      Class c=Class.forName(args);
             Method[] co=c. getDeclaredMethods();//得到某个类中声明的方法,不包括父类的方法
             for(Method con:co){
           System.out.println(con);
    }              
                  }         
           }
9. 动态方法调用
               在程序运行过程中间,可以动态的调用某个方法, Method类的invoke方法。 
method.invoke(方法所在的对象,  Object[ ]);      //调用方法
// Object[ ]是参数数组,如果没有参数可将数组大小为0或参数为
  它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 ( Integer) 中预先定义好的 TYPE 字段。
原创粉丝点击