黑马程序员——反射笔记

来源:互联网 发布:淘宝特别促销方案 编辑:程序博客网 时间:2024/06/05 18:03

-------android培训、java培训、期待与您交流! ----------

反射

反射:通过对象获取类的信息,所有对象都支持反这一个操作

1、实例化Class类对象

方式一:Date date=new Date();

      System.out.println(date.getClass());

方式二:利用类.class取得
Class<Date> date=Date.class;

      System.out.println(date);
方式三:Class<?> date= Class.forName("java.util.Date");

      System.out.println(date);
一般现在都使用第三种方式,这种方式是Spring的实现基础,而第二种是Hibernate的基础

2、利用反射实例化对象

使用newInstance()实例化对象
Class<?> date= Class.forName("java.util.Date");

      System.out.println(date.newInstance());

3、new 和反射的区别:

在下面这段代码中,子类可以随意增加,工厂类可以不做任何修改,只用修改主方法中的参数就可以了,使用反射后的最大好处是可以解耦合,用new不能实现解耦合,代码不灵活

public class Test {

   public static void main(String[] args) {

      Fruit fru=Factory.getInstance("Orange");

      fru.eat();

   }

}

interface Fruit{

   public void eat();

}

class Apple implements Fruit{

   public void eat(){

      System.out.println("吃苹果");

   }

}

class Orange implements Fruit{

   public void eat(){

      System.out.println("吃橘子");

   }

}

class Factory{

   public static Fruit getInstance(String classname){

      Fruit fru=null;

      try {

         fru=(Fruit) Class.forName(classname).newInstance();

      } catch (InstantiationException | IllegalAccessException

            | ClassNotFoundException e) {

         e.printStackTrace();

      }

      return fru;

   }

}

4、使用反射操作类的结构

类的结构分为:构造方法,普通方法,属性,有了反射,就可以实现获取这些方法和属性

【1】调用构造

通过如下两个方法可以取得构造:getConstructor()取得全部构造,getConstructor(Class<?> String )取得指定构造

【2】调用普通方法

Class类有如下两个方法来调用构造方法:getMethods()取得全部方法,getMethod()取得指定方法

在Method类之中存在一个invoke()方法,这个方法指的是调用反射指定的方法

【3】调用属性

类之中的属性用private封装的,也可以用反射操作

取得全部属性:getDeclaredField()

取得指定属性:getDeclaredField(String name)

Field类里面有个方法setAccessible(true)可以取消封装


0 0
原创粉丝点击