【Java】Java语言基础之反射

什么是反射:

反射就是把Java类中的各个成分映射成一个个的Java对象。
即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;
对于任意一个对象,都能调用它的任意一个方法和属性。
这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。

反射详解

这里有一个User类:

public class User {
 
 private String name;
 private int age;
 public User(){
  
 };
 public User(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }
 public void test() {
  System.out.println("test "+name);
 }
}

对于这个类,如果是自己定义的,所以知道里面的字段name和age,还有无参构造方法和有参构造方法,其中test方法也可以直接调用。当这个类不是自己定义的时候,我们在外部无法看到类的内部有哪些字段,有哪些方法,其修饰是public还是private的,这个时候,Java反射便可以很方便的去解决这个问题。

可是Java反射是如何在运行的时候去获取这些类的内部信息?

1.获取Class类

在java中万事万物皆对象,User user=new User()一行代码我们知道了user是User类的实例对象,通过Student stu=new Student()我们知道了stu是Student的实例对象,但是我们想过没,User和Student又是谁的对象呢?没错就是Class类的实例对象。那这个Class类是什么东西,内部长什么样子呢?这时候我们很自然的联想到使用反射机制。使用反射机制就可以获取到这个class。

public class Test {
 public static void main(String[] args) {
  User user = new User();
  Class c1 = User.class;
  Class c2 = user.getClass();
  try {
   Class c3 = Class.forName("com.no.test.Test");
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

c1、c2、c3都是Class类的实例,表示的都是User类

  Class c1 = int.class;
  Class c2 = String.class;
  Class c3 = double.class;
  Class c4 = Double.class;
  Class c5 = Void.class;

基本数据类型甚至是包括void我们也可以使用这个方法。

反射机制中获取Class类的方法进行一个总计:
在这里插入图片描述

2.获取类的方法

通过反射看一下User类内部的样子,打印一下:

public class Test {
 
 public static void main(String[] args) {
  User user = new User();
  printClassMethodMesssage(user);
 }
 
 public static void printClassMethodMesssage(Object obj) {
  Class c = obj.getClass();
  System.out.println("类的名称是:"+c.getName());
  Method[] ms = c.getMethods();
  for(int i = 0; i < ms.length; i++) {
   Class returnType = ms[i].getReturnType();
   System.out.print(returnType.getName()+" ");
   System.out.print(ms[i].getName()+"(");
   Class[] paramTypes = ms[i].getParameterTypes();
   for(Class class1 : paramTypes) {
    System.out.print(class1.getName()+",");
   }
   System.out.println(")");
  }
 }
}

打印结果:

类的名称是:com.no.reflect.User
java.lang.Class getClass()
void wait()
void wait(long,)
void wait(long,int,)
void test()
int hashCode()
boolean equals(java.lang.Object,)
void notifyAll()
java.lang.String toString()
void notify()

总结反射方法:
在这里插入图片描述

3.获取类的属性

获取所有属性:

 public static void printFieldMessage(Object obj) {
  Class c = obj.getClass();
  
  Field[] fs = c.getDeclaredFields();
  for(Field field : fs) {
   Class fieldType = field.getType();
   String typeName = fieldType.getName();
   String fieldName = field.getName();
   System.out.println(typeName+""+fieldName);
  }
 }

直接就会输出我们的字段类型和名称:

java.lang.Stringname
intage

总结反射方法:
在这里插入图片描述

4.获取类的构造方法
 public static void printConMessage(Object obj) {
  Class c = obj.getClass();
  Constructor[] cs = c.getDeclaredConstructors();
  for(Constructor constructor : cs) {
   System.out.print(constructor.getName()+"(");
   Class[] paramTypes = constructor.getParameterTypes();
   for(Class class1 : paramTypes) {
    System.out.print(class1.getName()+",");
   }
   System.out.println(")");
  }
 }

输出:

com.no.reflect.User()
com.no.reflect.User(java.lang.String,int,)

总结反射方法:
在这里插入图片描述

5.获取类的父类和接口

定义一个Human类,并让User继承。

 public static void getUserSuperClassAndInterface(Object obj) {
  Class c = obj.getClass();
  Object superClass = c.getSuperclass();
  System.out.println(superClass);
  Object[] superInterface = c.getInterfaces();
  for(Object myInterface : superInterface) {
   System.out.println(myInterface);
  }
 }

输出结果:

class com.no.reflect.Human
interface com.no.reflect.UserInterface
总结:

在上面的案例中,我们使用反射机制能够获取类的方法、字段、构造方法、父类和接口,当然也可以获取一些其他的信息。但是这里有一点重要的知识,那就是我们不仅可以获取上面的这些信息,还可以修改它,这对一个类来说是极其的不安全的。这一点我们需要注意。

学习Spring的时候,我们知道Spring主要有Ioc和AOP两大思想,它利用的是反射机制,依赖注入就不用多说了,而对于Spring的核心AOP来说,使用了动态代理,其实底层也是反射。当然还有动态代理模式、web拦截器等等,使用极其广泛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值