黑马程序员技术交流社区
标题:
java基础加强八-反射,注解
[打印本页]
作者:
清风木扬
时间:
2014-3-27 11:41
标题:
java基础加强八-反射,注解
一。反射(将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();
注解属性
作者:
许庭洲
时间:
2014-4-1 13:42
值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2