注解与反射

反射、注解  写框架用得比较多
反射会比我们正常写效率会低一点

原因:

反射
先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  Classcla;
 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)