反射实例

Java反射学习步骤:

1、  什么是反射机制?

2、  获取字节码文件对象(class)

3、  (Consrtuctor)用字节码对象(class) new一个对象

4、  获取和设置字段(Field)对象的值

5、获取指定class的函数(Method)并对其调用

6、反射实例


反射实例

New了一个Mainboard的类

package reflect.test;

/*反射四要素:

 *                  1、服务器

 *                  2、接口

 *                  3、要进行反射的类

 *                  4、配置文件

 *

 * 反射实例简介:

 *                  Mainboard(主板:相当于一个Tomcat服务器)中,

 *                  对Implements了PCI(接口)的NetCard(网卡)和SoundCard(声卡)

 *                  在只获取(从配置文件获取)它们的字符串条件下进行调用。

 */

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.util.Properties;

 

publicclass ReflectTest {

 

       publicstaticvoidmain(String[] args) throws IOException, Exception {

              Mainboard mb=newMainboard();

              mb.run();

              /*

               *

               * 问题:

               *           每次添加一个设备都需要修改代码传递一个新创建的对象

              *             mb.usePCi(newSoundCard());

              *             能不能不修改代码就完成这个动作?

              *需求:

              *             不用new来完成,而是只获取其class文件。在内部实现创建对象的动作。

              *

              *

              */

              File configFile =new File("pci.properties");

             

              Properties prop=newProperties();

              FileInputStream fis=newFileInputStream(configFile);

              prop.load(fis);

             

              for(intx=0;x<prop.size();x++) {

                     //知识点

                     StringpciName=prop.getProperty("pci"+(x+1));//获取类名的字符串。

                     Classclazz=Class.forName(pciName);//class对象是实现了PCI接口的类。

                     PCIp=(PCI)clazz.newInstance();//PCI该类还有PCI接口的所有方法,但不还有其它方法。

                     mb.usePCi(p);//运行。

                    

                    

              }

              fis.close();

       }

 

}

 

接口:

package reflect.test;

 

publicinterface PCI {

       publicvoid open();

       public  void close() ;

}

 

主板:

package reflect.test;

 

publicclass Mainboard {

       publicvoid run(){

              System.out.println("main board run....");

       }

       publicvoidusePCi(PCI p) {//PCIp=new soundCard();

              if(p!=null) {

                     p.open();

                     p.close();

              }

             

       }

}

 

声卡:

package reflect.test;

 

publicclass SoundCard implements PCI {

      

       publicvoid open(){

              System.out.println("sound open");

       }

       publicvoidclose() {

              System.out.println("sound close");

       }

}

 

网卡:

package reflect.test;

 

publicclass NetCard implements PCI {

 

       @Override

       publicvoid open(){

              System.out.println("net open");

       }

 

       @Override

       publicvoidclose() {

              System.out.println("net close");

       }

 

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java反射机制允许你在运行时检查和操作程序的内部结构,包括加载类、创建实例、访问私有成员等。通过反射,即使在编译时未知的情况下,也可以动态地创建和操作对象。下面是使用Java反射进行实例化对象的基本步骤: 1. **获取Class对象**:首先,你需要找到你要实例化的类的Class对象。你可以通过类名或ClassLoader获取。 ```java Class<?> clazz = Class.forName("com.example.MyClass"); ``` 2. **创建实例(如果为静态工厂方法)**:如果类没有无参构造函数,可以通过`newInstance()`方法创建,但这个方法通常用于静态工厂方法。 ```java Object instance = clazz.newInstance(); ``` 3. **使用Constructor实例化**:如果需要使用特定构造函数,可以获取Constructor对象并调用其newInstance方法。 ```java Constructor<?> constructor = clazz.getDeclaredConstructor(String paramType); // 假设有个带String参数的构造函数 instance = constructor.newInstance("exampleValue"); ``` 4. **使用Reflective Constructor**:使用`ReflectiveConstructor`更强大,可以处理所有参数类型,即使在编译时无法确定。 ```java Constructor<?>[] constructors = clazz.getConstructors(); Constructor<?> constructor = constructors; // 选择一个 instance = constructor.newInstance(); ``` 5. **创建对象实例**:调用`newInstance()`或`Constructor`的实例化方法即可得到新创建的对象。 **相关问题--:** 1. Java反射的局限性是什么? 2. 如何判断一个类是否支持反射? 3. 什么时候会使用反射,而不是直接实例化?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

志盛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值