注解和反射
1.注解
1.什么是注解
2.内置注解
3.元注解
1.元注解代码演示
package com.baidu.www;
import java.lang.annotation.*;
public class Test01 {
@M
public void show(){
}
}
//定义一个注解,表示注解的使用范围
@Target(value = {ElementType.METHOD})
//表示注解能在运行时间内使用
@Retention(value = RetentionPolicy.RUNTIME)
//是否生成文档
@Documented
//是否继承
@Inherited
@interface M {
}
4.自定义注解
1.自定注解代码演示
package com.baidu.www;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
public class Test02 {
@M1(name="易彪")
public void t(){
}
}
@Target(ElementType.METHOD)
@interface M1{
//注解定义参数 类型名+参数名();
String[] name() default "yx";
}
2.反射
1.new对象内存分析
2.获取Class类实体
3.创建class类的三种方式
package com.baidu.www;
//测试class类创建的方式有哪些
public class Test04 {
public static void main(String[] args) throws ClassNotFoundException {
//通过对象获取
Person person=new Person();
Class c1 = person.getClass();
//通过forname获取
Class c2= Class.forName("com.baidu.www.Person");
//通过类名直接获取
Class c3=Person.class;
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
}
}
class Person{
int id;
public Person(){
}
public Person(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class student extends Person{
}
4.所有类型的class
5.类的加载内存分析
1.画图分析
6.类的初始化
1.代码演示
package com.baidu.www;
public class Test05 {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println("主类的代码被加载");
//主动引用
//son s=new son();
//反射也会导致主动引用
// Class c=Class.forName("com.baidu.www.son");
//System.out.println();
//子类引用父类的静态变量不会导致子类初始化
//System.out.println(son.F);
//通过数组定义类不会导致初始化
//son[] son=new son[4];
//调用常量池的数不会导致初始化
int i=son.S;
}
}
class father {
static int F = 1;
static {
System.out.println("父类的静态代码块");
}
static int F2 = 4;
}
class son extends father {
static int S = 2;
static {
System.out.println("子类的静态代码块");
}
static final int S1 = 3;
}
7.类加载器
1.代码演示
package com.baidu.www;
import java.util.Properties;
public class Test06 {
public void show(){
}
public static void main(String[] args) {
//系统类加载器
ClassLoader classLoader= ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
//扩展类加载器
ClassLoader parent= classLoader.getParent();
System.out.println(parent);
//根加载器
ClassLoader s=parent.getParent();
System.out.println(s);
//如何获得系统类加载器的路径
System.out.println( System.getProperty("java.class.path"));
}
}
8.获取运行时的完整结构
代码演示
package com.baidu.www;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test07 {
public static void main(String[] args) throws ClassNotFoundException {
Class c=Class.forName("com.baidu.www.User");
//System.out.println(c.getName());
// System.out.println(c.getSimpleName());
//System.out.println(c.getMethods());
Field[] fields= c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
//获取类以及其父类的所有public方法
/* Method[] methods=c.getMethods();
for (Method method : methods) {
System.out.println(method);
}*/
Method[] methods=c.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
9.通过反射来创建对象并调用方法,属性
package com.baidu.www;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c=Class.forName("com.baidu.www.User");
//通过反射构造对象(无参构造)
/*User user= (User)c.newInstance();
System.out.println(user);*/
/*Constructor constructor= c.getDeclaredConstructor(String.class,int.class);
User user= (User) constructor.newInstance("yx",1);
System.out.println(user);*/
//有参构造
/* Constructor constructor= c.getDeclaredConstructor(String.class,int.class);
System.out.println(constructor.newInstance("YX", 2));*/
//通过反射调用方法
/* User user2=(User)c.newInstance();
Method method=c.getDeclaredMethod("setId", int.class);
method.invoke(user2,1);
System.out.println(user2);*/
//通过反射获得属性
User user3=(User)c.newInstance();
Field field=c.getDeclaredField("name");
field.set(user3,"yx");
System.out.println(user3);
}
}