JavaSE反射和注解

1、反射获取类对象

反射机制:可以操作字节码文件

在java中获取class的三种方式?

第一种:

Class c = Class.forName("完整类名");

第二种:

Class c = 对象.getClass();

第三种:

Class C = int.class;
Class C - String.class;

2、无参数构造方法来实例化对象

获取了class之后,可以调用无参数构造方法来实例化对象

//c代表的就是日期bate类型

Class c =  Class.forName("java.util.Date") ;

//实例化一个Date日期类型的对象

Object obj = c.newInstance() ;

一定要注意:

newInstance()底层调用的是该类型的无参数构造方法.

如果没有这个无参数构造方法会出现"实例化"异常。

如果你只想让一个类的静态代码块"执行的话,你可以怎么做?

Class. forName(“该类的类名”);

这样类就加载,类加载的时候,静态代码块执行! ! ! !

在这里,对该方法的返回值不感兴趣,主要是为了使用类加载"这个动作。

3、获取文件的绝对路径

这种方式是为了获取一个文件的绝对路径。( 通用方式,不会受到环境移植的影响。)

但是该文件要求放在类路径下,换句话说:也就是放到src下面

String path = Thread.currentThread().getContextClassLoader().getResource("写相对路径,但是这个相对路径从src出发开始找").getPath();
String path = Thread.currentThread().getContextClassLoader().getResource ("abc").getpath();
//必须保证src下有abc文件
String path = Thread.currentThread().getContextClassLoader().getResource("a/db").getpath();
//必须保证src下有a目录,a目录下有db
String path = Thread.currentThread().getContextClassLoader().getResource("com/bjpowernode/test.properties").getPath();
//必须保证src下有com目录,com目 录下有bjpowernode目录,bjpowernode目录下有test.properties文件

直接以流的形式返回:

Inputstream in = Thread.currentThread().getContextClassLoader().getResourceAsstream("com/bjpowernode/test.properties") ;

Io+Properties,怎么快速绑定属性资源文件?

//要求:第一这个文件必须在类路径下
//第二这个文件必须是以.properties结尾.
ResourceBundle bundle = ResourceBundle.getBundle("com/bjpowernode/test") ;
String value = bundle.getString(key);

4、反编译

1)反编译字段

public class Student {
   
    // Field翻译成字段,就是属性/成员
    // 4个Field分别采用不同的访问控制符权限修饰
    private String name;  //Field对象
    protected int age;  //Field对象
    public int no;
    boolean sex;
    public static final double MATH_PI = 3.14;
}
public class ReflectStudent {
   
    public static void main(String[] args) throws Exception{
   
        //创建这个为了拼接字符串
        StringBuilder s = new StringBuilder();
        Class studentClass = Class.forName("com.se.Student");
        s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+" {\n"); //public class Student {
   
        Field[] fields = studentClass.getDeclaredFields();
        for(Field field : fields){
   
            s.append("\t");
            s.append(Modifier.toString(field.getModifiers())); //private   public static final等
            s.append(" ");
            s.append(field.getType().getSimpleName()); //String
            s.append(" ");
            s.append(field.getName());  //name
            s.append(";\n");
        }
        s.append("}");
        System.out.println(s);
    }
}

结果:

public class Student {
private String name;
protected int age;
public int no;
boolean sex;
public static final double MATH_PI;
}

2)反编译方法

public class UserService {
   

你可能感兴趣的:(javaSE,java)