Java反射基础

发表于:2017-7-18 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sunny    来源:博客

  一般在开发中很少自己刻意去使用反射,但是在某些情况下反射却显得异常有用。在Java开发中反射几乎可以称之为万能公式,因为在某些时候它确实是万能的。一些常用的开发框架如Gson以及Web开发的SSH框架底层几乎无一例外采用反射机制,再如目前比较流行的使用注解的方式底层解析也是使用反射,所以反射几乎是学习Java进阶的不二之路。
  反射简介
  Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
  那么反射可以做什么呢?
  在运行时判断任意一个对象所属的类;
  在运行时构造任意一个类的对象;
  在运行时判断任意一个类所具有的成员变量和方法;
  在运行时调用任意一个对象的方法;
  生成动态代理。
  在Java中Object类是所有类的父类,Object提供了一个很多非常有用的方法如equals()、notify()、wait()、clone()等等,但是还有一个很少用却非常有用的方法getClass()方法,getClass()方法返回的是一个Class对象,Class对象是执行反射操作的关键所在。更多有关Class的介绍会在后续文章中进一步深入探讨,本篇文章重点介绍一下反射的基础知识点。
  Class位于java.lang包下面,但是所有反射相关的API基本位于java.lang.reflect子包下面。先看一下获取java.lang.Class对象的常用方式。
  Class类的静态方法forName(String className)。其中传入的className参数为类的全类名(包含具体包名的类名)。
  调用类的class属性来获取该类的Class对象。如Class strClass = String.class。
  调用对象的getClass()方法。
  反射部分常用方法介绍
  在进行介绍之前,先看一下反射中我们使用的一个测试类User。
  public class User implements Serializable{
  
  private static final long serialVersionUID = 1L;
  
  private String id;
  public String username;
  private int age;
  
  public User(){}
  
  private User(String id){
  this.id=id;
  }
  
  public User(String id,String username, int age) {
  this.id = id;
  this.username = username;
  this.age = age;
  }
  
  private void printId(){
  System.out.println("this is private method");
  }
  
  public static void printName(){
  System.out.println("this is static method");
  }
  
  public void sayHello(){
  System.out.println("hello world");
  }
  
  public void sayHello(String str){
  System.out.println("hello:"+str);
  }
  public String toString() {
  return "User [username=" + username + ", age=" + age + ", id=" + id
  + "]";
  }
  }
  public class User implements Serializable{
  
  private static final long serialVersionUID = 1L;
  
  private String id;
  public String username;
  private int age;
  
  public User(){}
  
  private User(String id){
  this.id=id;
  }
  
  public User(String id,String username, int age) {
  this.id = id;
  this.username = username;
  this.age = age;
  }
  
  private void printId(){
  System.out.println("this is private method");
  }
  
  public static void printName(){
  System.out.println("this is static method");
  }
  
  public void sayHello(){
  System.out.println("hello world");
  }
  
  public void sayHello(String str){
  System.out.println("hello:"+str);
  }
   
  public String toString() {
  return "User [username=" + username + ", age=" + age + ", id=" + id
  + "]";
  }
  }
  获取类的Class实例
  上面已经介绍了可以通过三种方式获取Class实例,事实上三种方式获取到的Class实例是同一个。
  User user = new User();
  System.out.println(User.class);
  System.out.println(user.getClass());
  System.out.println(Class.forName("com.yimi.demo.bean.User"));
  System.out.println(User.class == user.getClass());
  System.out.println(User.class == Class.forName("com.yimi.demo.bean.User"));
  //class com.yimi.demo.bean.User
  //class com.yimi.demo.bean.User
  //class com.yimi.demo.bean.User
  //true
  //true
  User user = new User();
  System.out.println(User.class);
  System.out.println(user.getClass());
  System.out.println(Class.forName("com.yimi.demo.bean.User"));
  System.out.println(User.class == user.getClass());
  System.out.println(User.class == Class.forName("com.yimi.demo.bean.User"));
  //class com.yimi.demo.bean.User
  //class com.yimi.demo.bean.User
  //class com.yimi.demo.bean.User
  //true
  //true

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号