①
load() 配置文件,通过字符流fileReader读取配置文件stu.properties
获取value
②
、、
反射获取字节码文件对象,forName()、、传入路径
、、获取构造
、、创建对象
package com.baidu.test;
import org.junit.jupiter.api.Test;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.util.Properties;
/**
* @auther SyntacticSugar
* @data 2018/9/4 0004下午 2:37
*/
public class Test03 {
public static void main(String[] args) {
//stu.properties 文件中,创建一个学生对象
//className=cn.itcast.reflect.Student
//name=rose
//age=18
//gender=女
try {
Properties properties = new Properties();
properties.load(new FileReader("src/stu.properties"));//字符流读取文件
String name = properties.getProperty("name");//依据key ---》value
int age = Integer.parseInt(properties.getProperty("age"));//int
String gender = properties.getProperty("gender");
// System.out.println(name+age+gender);
//
//forName 获取对象
Class<?> clazz = Class.forName("com.baidu.test.Stu");
/**
* 获取单个Constructor 对象< 指定有参数构造方法 ></>
*/
// Constructor<?> cc = clazz.getDeclaredConstructor(String.class, int.class, String.class);
// cc.setAccessible(true);
//
// Object o = cc.newInstance(name,age, gender);
// System.out.println(o);
/**
* 获取Constructor 数组对象
*
*/
Constructor<?>[] dcc = clazz.getDeclaredConstructors();
checkConstructors(dcc);//查看构造方法
dcc[1].setAccessible(true);
Object o = dcc[1].newInstance(name,age,gender);
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
private static void checkConstructors(Constructor<?>[] dcc) {
for (Constructor<?> constructor : dcc) {
System.out.println(constructor);
//public com.baidu.test.Stu()
//public com.baidu.test.Stu(java.lang.String,int,char)
}
}
}
class Stu {
private String name;
private int age;
private String gender;
public Stu() {
}
public Stu(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
//
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
常见的注解:
-
@author:用来标识作者名。
-
@version:用于标识对象的版本号。
-
@Override :用来修饰方法声明,告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译失败。
-
@Deprecated: 用来表示不赞成使用.
package com.baidu.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* @auther SyntacticSugar
* @data 2018/9/4 0004下午 4:32
*/
public class Test05 {
public static void main(String[] args) {
//1. 模拟Junit测试的注释@Test,首先需要编写自定义注解@MyTest,并添加元注解,
// 保证自定义注解只能修饰方法,且在运行时可以获得。
//2. 然后编写目标类(测试类),然后给目标方法(测试方法)使用 @MyTest注解,编写三个方法,
// 其中两个加上@MyTest注解。
//3. 最后编写调用类,使用main方法调用目标类,模拟Junit的运行,只要有@MyTest注释的方法都会运行。
try {
Class<?> clazz = Class.forName("com.baidu.test.MytestClass");
Object o = clazz.getDeclaredConstructor().newInstance();
Method[] dm = clazz.getDeclaredMethods();
// System.out.println(Arrays.toString(dm));
//运行时刻获的
for (Method method : dm) {
if (method.isAnnotationPresent(MyTest.class)) {
method.invoke(o);//执行方法
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyTest {
}
class MytestClass {
@MyTest
public void show1() {
System.out.println("1------------");
}
@MyTest
public void show2() {
System.out.println("2------------");
}
public void show3() {
System.out.println("3------------");
}
}
自定义注解,注解元注解:
package com.company.anntation;
import org.junit.jupiter.api.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Arrays;
/**
* @auther SyntacticSugar
* @data 2018/9/6 0006下午 10:32
* <p>
* 注解:
* target 的使用, // @Target 使用的目标位置
*/
public class Demo02 {
}
//反射必须将 `保留策略` 定义运行时, 没有选择.
//target 是定义使用的位置,
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Books {
//书名 作者 价格
String name();
String[] authers();
int price() default 65;
}
//
class Bookshelf {
String id;
// @Book(value = "降龙十九掌", authors = {"张三丰", "灭绝师太"})
@Books(name = "value在", authers = {"少林方丈", "峨眉周芷若"})
public void showInfo() {
String name = "";
String[] authers = {};
int price = 0;
System.out.println("名字" + name + "价格" + price + "作者数组" + Arrays.toString(authers));
}
}