1,反射机制获取类有三种方法,
第一种利用类.class
class person{
}
public class Javaapidemo {
public static void main(String[] args) {
Class cl1=person.class;
System.out.println(cl1);
}
}
第二种利用实例化对象,在实例化对象.getclass
ackage file;
import java.util.Date;
public class Javaapidemo {
public static void main(String[] args) {
Date date=new Date();
System.out.println(date.getClass());
}
}
第三种在Class类里面提供有一个statiic方法;
package file;
import java.util.Date;
class people{
}
public class Javaapidemo {
public static void main(String[] args) throws ClassNotFoundException {
Class cls=Class.forName("file.people");
System.out.println(cls.getName());
}
}
}
}
反射实例化对象
package file;
class people{
public people() {
System.out.println("哈哈哈哈我是个人");
}
@Override
public String toString() {
return "一个帅哥";
}
}
public class Javaapidemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class cls=Class.forName("file.people");
Object obj=cls.newInstance();////创建此Class 对象所表示的类的一个新实例
System.out.println(obj);////调用了peoplee的无参数构造方法.
}
}
newInstance()方法在JDK1.9被废除应为只能调用构造方法
反射与工厂设计模式
原来的工厂模式要新的厂品时要重新添加厂品线例如
package fanshe;
import com.lyh.Message;
interface message{
public void send();
}
class weChat implements message{
@Override
public void send() {
System.out.println("哈哈哈");
}
}
class qq implements message{
@Override
public void send() {
System.out.println("你是猪");
}
}
class Factory{
private Factory() {
}
public static message getmessage(String classname){
if ("weChat".equalsIgnoreCase(classname)){
return new weChat();
}else if ("qq".equalsIgnoreCase(classname)){
return new qq();
}else{
return null;
}
}
}
public class test {
public static void main(String[] args) {
message msg=Factory.getmessage("weChat");
msg.send();
}
}
此时·无需
package fanshe;
import com.lyh.Message;
import java.lang.reflect.InvocationTargetException;
interface message{
public void send();
}
class weChat implements message{
@Override
public void send() {
System.out.println("哈哈哈");
}
}
class qq implements message{
@Override
public void send() {
System.out.println("你是猪");
}
}
class Factory{
private Factory() {
}
public static message getmessage(String classname) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
message instance=null;
instance= (message)Class.forName(classname).getDeclaredConstructor().newInstance();
return instance;
}
}
public class test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
message msg=Factory.getmessage("fanshe.weChat");
msg.send();
}
}
当有多个接口时要用泛型解决
package fanshe;
import java.lang.reflect.InvocationTargetException;
interface IService{
public void service();
}
interface message{
public void send();
}
class videoserice implements IService{
@Override
public void service() {
System.out.println("我们视频吧");
}
}
class weChat implements message{
@Override
public void send() {
System.out.println("哈哈哈");
}
}
class qq implements message{
@Override
public void send() {
System.out.println("你是猪");
}
}
class Factory{
/*
获得接口实例化对象
className 接口子类
clazz描述的是有个接口类型
return 如果子类存在则返回指定接口实例化对象
*/
private Factory() {
}
public static <T> T getmessage(String classname,Class<T> clazz) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
T instance=null;
instance= (T) Class.forName(classname).getDeclaredConstructor().newInstance();
return instance;
}
}
public class test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
message msg=Factory.getmessage("fanshe.weChat",message.class);
IService se=Factory.getmessage("fanshe.videoserice",IService.class);
msg.send();
se.service();
}
}