java反射浅谈

任何一个类都是Class的实例对象

这个实例对象有三种表示方式:

  1. 任何一个类都有一个隐含的静态成员变量class

    1
    2
    class Foo(){}
    Class c1 = Foo.class();
  2. 该类的对象可以通过getClass方法

    1
    2
    Foo f1 = new Foo();
    Class f2 = f1.getClass();
  3. 通过Clas.forName方法创建Class的实例对象

    1
    Class c3 = Class.forName("com.bin.test.Foo");

静态加载与动态加载的区别:

  1. 静态加载会在编译时检查所有需要new的对象类是否存在,不存在就会报错。
  2. 动态加载通过Clas.forName(“全包名参数”)去加载类对象,编译时不会报错,只有在运行时传入的全包名参数代表的类不存在时才会报错。

基本的数据类型都存在类类型

1
2
3
4
5
6
7
public ClassTest{
public static void main(String[] args){
Class c1 = int.class;
Class c2 = Double.class;
Class c3 = void.class();
}
}

反射获取类的对象

反射获取无构造参数的类

1
2
3
4
5
6
7
8
9
10
11
@Test
public void getInstanceWithNoParameter() {
Class<Food> c1 = Food.class;
try {
Food food = c1.newInstance();
food.setName("面包");
System.out.println(food.getName());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}

反射获取含有多个参数的构造函数的类

1
2
3
4
5
6
7
8
9
10
11
@Test
public void getInstanceWithMoreParameter() {
try {
Class<Food> c2 = Food.class;
Constructor<Food> constructor = c2.getConstructor(String.class, Double.class);
Food food = constructor.newInstance("milk", 22.2);
System.out.println(food.toString());
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
}

反射获取类方法

获取类所有公有访问权限方法

获取类所有访问权限为public的方法,包括从父类继承下来的public方法

1
2
3
4
5
6
@Test
public void getPublicMethodElement() {
Class<Food> c1 = Food.class;
Method[] methods = c1.getMethods();
printMethod(methods);
}

获取类所有权限的方法

获取类所有自定义的方法,包括所有访问权限的方法,不包括从父类继承下来的方法

1
2
3
4
5
6
@Test
public void getDeclaredMethodElement() {
Class<Food> c1 = Food.class;
Method[] methods = c1.getDeclaredMethods();
printMethod(methods);
}

文章目录
  1. 1. 任何一个类都是Class的实例对象
  2. 2. 基本的数据类型都存在类类型
  3. 3. 反射获取类的对象
    1. 3.1. 反射获取无构造参数的类
    2. 3.2. 反射获取含有多个参数的构造函数的类
  4. 4. 反射获取类方法
    1. 4.1. 获取类所有公有访问权限方法
    2. 4.2. 获取类所有权限的方法
| 45.9k | |