您的位置:首页 > 编程语言 > Java开发

注解与反射

2016-06-28 22:46 274 查看
反射、注解  写框架用得比较多

反射会比我们正常写效率会低一点

原因:

反射

先new类class,然后在从类里面new对象。所以搞框架,因为也不知道别人想要做什么,所以我们就是规则制定者

正常

直接new对象

反射在运行起来才能够知道对错

反射

 Class

获取Class对象的三种方式:

1.类名.class;

2.对象.getClass()

3.Class.forName("完整类名");

Field=>属性

Method=> 方法

Constructor=>构造方法

.getxxx=>只能获取public修饰的元素

.getDeclaredxxx()=>获取任意修饰符修饰的元素

---------------------------------------

库:获取到任意一个类的所有成员=>com.info.GetInfo

-------------------------------------------

工程里面的根目录即是工程名的下一层目录

-------------------------------------

反射创建对象:

 1.直接调用Class对象的.newInstance()创建对象<调用的是无参构造方法,如果没有就报错>

 2.根据Class对象获取相应的构造方法对象Constructor,再通过构造方法创建对象

------------------------------------------------------------

注解:

元数据

数据的数据,就是描述数据大小,色素之类

-----------------------------------

Java中的三个标准注解

 @Override  标注是一个重写的方法

 @Deprecated 标示已过时的

 @SuppressWarnings 抑制编译器警告的    后面是一个字符串数组

---------------------------------------------------------

废话少说:直接上代码,连同注释

------------------------------------------------------------------------------------------

以下为直接使用Note.class 注释类作配置文件进行编程,然后得到一个测试类属性,方法和构造方法的框架

package pratice1;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class ManFactory {

 private  Class<?>cla;

 public ManFactory(Class<?> cla){

  //如果这个类为注释类则返回true

  if(cla.isAnnotationPresent(Note.class)){

   //返回此元素上所有的注释

   Note n=cla.getAnnotation(Note.class);

   System.out.println(n);

   //得到注释上的值

   String str=n.value();

   System.out.println(str);

   try {

    this.cla=Class.forName(str);

   } catch (ClassNotFoundException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

 }

//下面的方法是从配置文件里面得到Class

 //Properties p=new Properties();//放在外边需要输入类

// {

//  Properties p=new Properties();

//  try {

//   p.load(new FileInputStream("cla.properties"));

//   String classname=p.getProperty("cla");

//   cla=Class.forName(classname);

//  } catch (IOException e) {

//   // TODO Auto-generated catch block

//   e.printStackTrace();

//  } catch (ClassNotFoundException e) {

//   // TODO Auto-generated catch block

//   e.printStackTrace();

//  }

// }

 public void getfield(){

  //得到全部属性

  System.out.println("得到全部属性");

  Field [] all=cla.getDeclaredFields();

  for (Field field : all) {

   System.out.println(field);

  }

 }

 public void getmethod(){

  System.out.println("得到全部的方法");

  Method []all=cla.getDeclaredMethods();

  for (Method method : all) {

   System.out.println(method);

  }

 }

 public void getconstructor(){

   System.out.println("得到全部构造方法");

   Constructor<?>[]all=cla.getDeclaredConstructors();

   for (Constructor<?> constructor : all) {

    System.out.println(constructor);

   }

 

 }

}

----------------------------------------------------------------------------------------------

Note注释类:

package pratice1;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface Note {

 String value();//用来存放配置名称的

}

将以上两个类进行导成jar包,即可以得到一个简单的输出属性,方法,构造方法的jar包

-----------------------------------------------------------------------------------------

下面是相关的测试方法:

package pratice1;

@Note("pratice1.Man")

public class Test {

 public static void main(String[] args) {//如果@Zhujie里面的Retention方式不是Runtime的话,则

           //NULLPointerException异常

  // TODO Auto-generated method stub

  ManFactory mf=new ManFactory(Test.class);

  mf.getfield();

  mf.getmethod();

  mf.getconstructor();

 }

}

----------------------------------------------------------------------------

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class java