反射指的是对象的反向处理操作,就首先需要观察一下“正”的操,在作,在默认情况下,必须要先导入一个包,才能产生类的实例化对象:
所谓的“反”指的是根据对象来取得对象来源信息,而这个“反“的操作核心的处理在于Object类的方法
取得Class对象:public final Class<?> getClass()
该方法返回的是一个Class类的对象,这个Class描述的就是类。
范例:调用getClass()方法
1 package cn.Tony.demo; 2 3 import java.util.Date; 4 5 public class TestDemo{ 6 public static void main(String[] args) throws Exception { 7 Date data=new Date();//正常来讲需要通过类才可以产生实例化对象 8 System.out.println(data.getClass()); 9 } 10 }
此时通过对象的取得了对象的来源,这就是“反”的本质。
反射的世界里面它所看重的不再是一个对象,而是对象身后的组成(类,对象,成员,组成)
Class类是描述整个类的概念,所有也是整个反射的操作源头,那么在使用Class类的时候需要关注的仍然是这个类的对象,而这个类的对象产生模式一共有三种。
任何的实例化对象,都可以使用Object类中的getClass()方法取得Class类对象。
1 package cn.Tony.demo; 2 3 import java.util.Date; 4 5 public class TestDemo{ 6 public static void main(String[] args) throws Exception { 7 Class<?> cls=new Date().getClass(); 8 System.out.println(cls.getName()); 9 } 10 }
“类.class”:直接根据某一个具体的类来取得Class类的实例化对象,
1 package cn.Tony.demo; 2 import java.util.Date; 3 public class TestDemo{ 4 public static void main(String[] args) throws Exception { 5 Class<?> cls=Date.class;//不需要实例化Date类对象了 6 System.out.println(cls.getName()); 7 } 8 }
使用Class类提供的方法:public static Class<?> forName(String className)throws ClassNotFoundException
范例:使用forName()方法
1 package cn.Tony.demo; 2 public class TestDemo{ 3 public static void main(String[] args) throws Exception { 4 Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了 5 System.out.println(cls.getName()); 6 } 7 }
在以上的3个方法里面,发现神奇地方。除了第一种形式会产生Date类的实例化对象之外,其他两种都不会产生Date类的实例化对象。于是取得了Class类对象有一个最直接的好处:可以直接通过反射实例化对象,在我们的Class类里面定义有如下方法:public T newInstance()throws InstantiationException,IllegalAccessException
范例:反射实例化对象
1 package cn.Tony.demo; 2 public class TestDemo{ 3 public static void main(String[] args) throws Exception { 4 Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了 5 Object obj=cls.newInstance(); 6 System.out.println(obj); 7 } 8 }
那么现在发现除了关键字new之外,对于对象的实例化模式有了第二种做法。通过反射进行。
取得了Class类对象就意味着取得了一个指定类的操作权
---恢复内容结束---
反射指的是对象的反向处理操作,就首先需要观察一下“正”的操,在作,在默认情况下,必须要先导入一个包,才能产生类的实例化对象:
所谓的“反”指的是根据对象来取得对象来源信息,而这个“反“的操作核心的处理在于Object类的方法
取得Class对象:public final Class<?> getClass()
该方法返回的是一个Class类的对象,这个Class描述的就是类。
范例:调用getClass()方法
1 package cn.Tony.demo; 2 3 import java.util.Date; 4 5 public class TestDemo{ 6 public static void main(String[] args) throws Exception { 7 Date data=new Date();//正常来讲需要通过类才可以产生实例化对象 8 System.out.println(data.getClass()); 9 } 10 }
此时通过对象的取得了对象的来源,这就是“反”的本质。
反射的世界里面它所看重的不再是一个对象,而是对象身后的组成(类,对象,成员,组成)
Class类是描述整个类的概念,所有也是整个反射的操作源头,那么在使用Class类的时候需要关注的仍然是这个类的对象,而这个类的对象产生模式一共有三种。
任何的实例化对象,都可以使用Object类中的getClass()方法取得Class类对象。
1 package cn.Tony.demo; 2 3 import java.util.Date; 4 5 public class TestDemo{ 6 public static void main(String[] args) throws Exception { 7 Class<?> cls=new Date().getClass(); 8 System.out.println(cls.getName()); 9 } 10 }
“类.class”:直接根据某一个具体的类来取得Class类的实例化对象,
1 package cn.Tony.demo; 2 import java.util.Date; 3 public class TestDemo{ 4 public static void main(String[] args) throws Exception { 5 Class<?> cls=Date.class;//不需要实例化Date类对象了 6 System.out.println(cls.getName()); 7 } 8 }
使用Class类提供的方法:public static Class<?> forName(String className)throws ClassNotFoundException
范例:使用forName()方法
1 package cn.Tony.demo; 2 public class TestDemo{ 3 public static void main(String[] args) throws Exception { 4 Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了 5 System.out.println(cls.getName()); 6 } 7 }
在以上的3个方法里面,发现神奇地方。除了第一种形式会产生Date类的实例化对象之外,其他两种都不会产生Date类的实例化对象。于是取得了Class类对象有一个最直接的好处:可以直接通过反射实例化对象,在我们的Class类里面定义有如下方法:public T newInstance()throws InstantiationException,IllegalAccessException
范例:反射实例化对象
1 package cn.Tony.demo; 2 public class TestDemo{ 3 public static void main(String[] args) throws Exception { 4 Class<?> cls=Class.forName("java.util.Date");//不需要实例化Date类对象了 5 Object obj=cls.newInstance(); 6 System.out.println(obj); 7 } 8 }
那么现在发现除了关键字new之外,对于对象的实例化模式有了第二种做法。通过反射进行。
取得了Class类对象就意味着取得了一个指定类的操作权
1 package cn.Tony.demo; 2 3 interface IFruit{ 4 public void eat(); 5 } 6 interface IMessage{ 7 public void print(); 8 } 9 class MessageImpl implements IMessage{ 10 @Override 11 public void print() { 12 System.out.println("www.Tony.com"); 13 } 14 } 15 class Apple implements IFruit{ 16 @Override 17 public void eat() { 18 System.out.println("【Apple】吃苹果"); 19 } 20 } 21 class Factory{ 22 private Factory() {} 23 public static <T> T getInstance(String className) { 24 T obj=null; 25 try { 26 obj=(T)Class.forName(className).newInstance(); 27 } catch (Exception e) { 28 // TODO Auto-generated catch block 29 e.printStackTrace(); 30 } 31 return obj; 32 } 33 } 34 public class TestDemo{ 35 public static void main(String[] args) throws Exception { 36 IFruit fruit=Factory.getInstance("cn.Tony.demo.Apple"); 37 fruit.eat(); 38 IMessage msg=Factory.getInstance("cn.Tony.demo.MessageImpl"); 39 msg.print(); 40 } 41 } 42