A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 清风木扬 中级黑马   /  2014-3-27 11:41  /  1684 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

一。反射(将java类中的各种成分映射成相应的java类)
  
1. 反射基石是Class, 各个java类属于同一类事物,描述这些的java类名叫Class

2.获取类的字节码
    Class   类名.class
   Class   Class.forName("类名")
   Class   类对象.getClass()

   isPrimitive()是否是基本类型8种(byte,shor,int,long,char,double,float,boolean)和void

    int.class()==Integer.class ;//false
    int.class()==Integer.TYPE;//true

   3. Constructor
    反射字节码得到Constructor,通过Constructor的newInstance()方法新建对象
       Class实例.getConstructors();所有的构造方法
      Class实例.getConstructor(参数字节码);某个的构造方法
      newInstance(参数)新建对象
    例子:
       Constructor cons=People.class.getConstructor(String.class);
       People p=(People)cons.newInstance("sss");

   4.Field
    Class实例.getField();可见
    Class实例.getDeclaredField();不可见也可以访问
    Class实例.getFields("");

   field实例.get(对象); field从那个对象上取值
   field.setAccessible(true);私有字段的可以取值。
   例子:
      Constructor cons=People.class.getConstructor(String.class);
       People p=(People)cons.newInstance("sss");
      
       Field fld=People.class.getDeclaredField("name");
       fld.setAccessible(true);
       System.out.println(fld.get(p));
   5.Mathod
    invoke(对象,参数)第一参数是null时,这个方法是静态方法
    getMethod("方法名",ClassParameter ... args)

6.反射main方法
启动java程序的main方法的参数是一个字符串数组,即public static void main(Stirng
[] args),通过反射方式来调用这个main方法时,如何为invoe方法传递参数?按jdk1.5的语法,
整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递
给invoke方法时,javac会到底按照哪种语法进行处理呢?jbk1.5要兼容jbk1.4的语法,会按jdk1.4的语法进行处理
即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码.
即mainMethod.invoke(null,new String[]{xx}),javac只把它当作jdk1.4的语法进行理解,
而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。

mainMethod.invoke(null,new.Object[](new String[]{"xx"}));
mainMethod.invoke(null,(Object)new String[]{""});

数组与Object的关系
int[] a1=new int[]{1,2,3};
int[][] a2=new int[2][3];
String[] a3=new String[]{"23","sdf","gh"};

Object object1=a1;  //一个对象
Object[] object2=a1; //a1拆 []后里面是int类型。基本类型不是对象。
//

       int[] a1=new int[]{1,2,3};
       int[][] a2=new int[][]{{1,2},{2,3}};
       String[] sts=new String[]{"a","b","c"};
       String s="sdf";
      
       Object object1=a1;
       Object[] object2=a2;
       Object[] object3=sts;
       Object object4=s;
      
       System.out.println(Arrays.asList(object1));
       System.out.println(Arrays.asList(object2));
       System.out.println(Arrays.asList(object3));
       System.out.println(Arrays.asList(object4));

//
[[I@150bd4d]
[[I@4a5ab2, [I@1888759]
[a, b, c]
[sdf]
  7.JavaBean
  特殊的JAVA类(有属性的get,set方法)
  xx属性  getXx()  setXx(**)
  属性名--如果第二个字母是小的,则把第一个字母变成小的-age
  gettime->time   getCPU->CPU
8.内省(提供对javaBean进行操作的一些API)
   PropertyDescriptor
             PropertyDescriptor(propertyName,类字节码)
             getReadMethod()
             getWriteMethod()
  BeanInfo

   BeanInfo beanInfo=Introspector.getBeanInfo(pt1.getClass());
   PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
   Object retVal=null;
   for(ProertyDescriptor pd:pds)
   {
      if(pd.getName().equals(propertyName))
      {
        Method readM=pmd.getReadMethod();
        return (String)readM.invoke(p);
      }
  }
  9.BuBeanUtils
    加载conmmonts-logging.jar  conmeonts-beanutils.jar
     project/bulid path/config/bulid path    /add to bulid path

BeanUtils.getProperty(pt1,"x");
BeanUtils.setProperty(pt1,"x","9");


二注解
   
1. 注解Annotation(可以加包,类,成员变量,方法,方法参数,局部变量)相当于一标记,

2.常用注解
@SuppressWarnings("deprecation")--抑制警告(过时)
@Deprecated  --让方法过时
@Override--覆盖

3.应用步骤
  注解类  @interface
  应用“注解类的”类
  对{应用“注解类的”类}操作的类
4.自定义注解
//源注解(注解类上的注解)
@Retention(RetentionPolicy.RUNTIME)注解的生命周期
RetentionPolicy.SOURCE
RetentionPolicy.CLASS(默认值)
@Target(ElementType.METHOD)定义注解可以放的位置

         if(AnnotationTest.class.isAnnotationPresent(ContelAnnotation.class))
         {
             ContelAnnotation contelAnnotation=(ContelAnnotation)AnnotationTest.class.getAnnotation(ContelAnnotation.class);
             System.out.println(contelAnnotation.color());
         }
5可以添加的属性
String color();//使用时必须给值。
String value();//如果只有value要设值可以将“名称=”省略
String color() default "blue";
int[] arrayA();
枚举属性
EnumTest.TrafficLap lamp();
注解属性






评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马