JavaSE(十)

JavaSE(十)

一、获取Class三个方式

  1. 静态方法Class.forName(“完整类名带包名”)
//c表示String.class文件,或者说代表String类型
Class c = Class.forName("java.lang.String");
  1. java中任何一个对象都有一个方法getClass()
String s = "abc";
//s表示String.class文件,或者说代表String类型
Class s = s.getClass();
//都指向方法区中的同一个字节码文件
System.out.println(c==s);//true
  1. java中任何一种类型,包括基本数据类型,它都有.class属性
//z表示String.class文件,或者说代表String类型
Class z = String.class;

二、通过反射实例化对象

  1. newInstance();
//类加载,会执行类中的静态代码块
Class c = Class.forName("java.long.String");
//调用类的无参数构造方法
Object obj = c.newInstance();

三、拿到类路径下文件的绝对路径

//Thread.cuurentThread() 当前线程对象
//getContextClassLoader() 获取当前线程的类加载器对象
//getResource() 获取资源,类加载器对象的方法,当前线程的类加载器默认从类的根路径下加载资源
String path = THread.cuurentThread().getContextClassLoader().getResource("类路径下文件路径").getPath();
//以流的形式返回
InputStream reader = Thread.currentThread().getContextClassLoader().getResourceAsStream("类路径下文件路径");

四、资源绑定器

//资源绑定器,只能绑定xxx.properties文件。并且这个文件必须在类路径下
//扩展名不用写
ResourceBundle bundle = ResourceBundle.getBundle("文件路径");
String className = bundle.getString("key");

五、反射属性类Field

//获取整个类
Class s = Class.forName("类文件路径");

//获取完整类名
s.getName();
//获取简类名
s.getSimpleName();

//获取类中所有的Field(public修饰的属性)
Field[] fields = s.getFields();

//获取类中所有的Field
Field[] fs = s.getDeclaredFields();

//获取属性的名字
fs[0].getName();

//获取属性的类型
Class field = fs[0],getType();
//类的名字
field.getName();

//获取属性的修饰符列表,返回的是修饰符的代号
int i = fs.getModifiers();
//将代号转换成字符串
Modifier.toString(i);

六、通过反射机制访问对象属性

//获取类
Class studentClass = Class.forName("Student路径");
//实例对象
Object obj = studentClass.newInstance();
//获取类中的no属性,这里访问公开的属性
Field noField = studentClass.getDeclaredField("no");
//给obj对象的no属性赋值
noFiled.set(obj,123);
//读取no属性的值
int i = noFiled.get(obj);

//怎么访问私有属性
Field nameField = studentClass.getDeclaredField("私有属性");
//打破封装
nameField.setAccessible(ture);

七、可变长度参数

//1、可变长度参数要求的参数个数是0-N个
//2、可变长参数在参数列表中必须在最后的位置上,只能有一个
//3、可以当作数组来看待
public static void m(int... args){

}

八、反射Method

Class userServiceClass = Class.forName("路径");
//获取所有的Method(包括私有的)
Method[] methods = userServiceClass.getDeclaredMethods();
//获取方法名
methods[0].getName();
//获取返回值类型
methods[0].getReturnType().getSimpleName();
//获取修饰符列表
Modifier.toString(methods[0].getModifiers());
//获取参数列表
Class[] parameterTypes = methods[0].getParameterTypes();
parameterTypes[0].getSimpleName();

九、通过反射机制,调用对象的方法

Class userServiceClass = Class.forName("路径");
//创建对象
Object obj = userServiceClass.newInstance();
//通过方法名,和参数列表获取指定方法
Method loginMethod = userServiceClass.getDeclaredMethod("login",String.class,String,class);
//四要素,对象,方法,参数,返回值
Object retValue = loginMethod.invoke(obj,"admin","123");

十、反射Contructor构造方法

Class vipClass = Class.forName("类路径");
//获取构造方法
Constructor[] constructors = vipClass.getDeclaredConstructors();
//修饰符列表
Modifier.toString(constructor.getModifiers());
//参数列表
Class[] parameterTypes = constructor.getParameterTypes();
parameterTypes[0].getSimpleName();

十一、通过反射机制创建对象

Class c = Class.forName("类路径");
//获取构造方法
Constructor con = c.getDeclaredConstructor(int.class,String.class,String.class,boolean.class);
//通过有参构造方法创建对象
Object newObj = con.newInstance(110,"jackson","1999-10-11",true);

十二、通过反射获取类的父类和接口

Class stringClass = Class.forName("java.lang.String");
//获取父类
Class superClass = stringClass.getSuperclass();
//获取接口
Class[] interfaces = stringClass.getInterfaces();

十三、注解

  1. Target
    1. 元注解
    2. 用来标注,“被标注的注解”可以出现在哪些位置上
    3. @Target(ElementType.METHOD):表示该注解只能出现在方法上
  2. Retention
    1. 元注解
    2. 这个Retention注解用来标注“被标注的注解”最终保存在哪里
    3. @Retention(RetentionPolicy.SOURCE):表示该注解只能被保存在java源文件中
    4. @Retention(RetentionPolicy.CLASS:表示该注解只能被保存在class文件中
    5. @Retention(RetentionPolicy.RUNTIME):表示该注解只能被保存在class文件中,并且可以被反射机制读取
  3. Override
    1. 被@Target(ElementType.METHOD)标注,只能标注在方法上
    2. 表示必须是重写的父类方法
  4. Deprecated
    1. 表示已过时
  5. 注解中的属性可以是基本数据类型和String、Class、枚举类型以及以上每一种的数组形式
  6. 自定义注解
public @interface MyAnnotation1{
	//属性
	String name();
	String[] color();
	//默认为25
	Int age() default 25;
}

public @interface MyAnnotation2{
	//如果一个注解的属性的名字是value的话,并且只有一个属性,在使用的时候,该属性名可以省略
	String value();
}

public class MyAnnotationTest{

	@MyAnnotation1(name="zhangsan",color = {"红色","蓝色","绿色"})
	//如果数组中只有一个元素,大括号可以省略
	@MyAnnotation1(name="zhangsan",color = "红色")
	public void doSome1(){
	}
	//省略了vlaue
	@MyAnnotation2("haha")
	public void doSome2(){
	}
}

十四、通过反射获取注解对象的属性的值

//获取类
Class c = Class.forName("类路径");
//判断类上面有没有MyAnnotation,并且还要是可以被反射的
c.isAnnotationPresent(MyAnnotation.class);//ture或false
//获取注解对象
MyAnnotation myAnnotation = (MyAnnotation)c.getAnnotation(MyAnnotation.class);
//获取注解对象的属性
String value = myAnnotation.value();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值