反射、注解 写框架用得比较多
反射会比我们正常写效率会低一点
原因:
反射
先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();
}
}
----------------------------------------------------------------------------