通过反射机制加载类驱动和创建类实现:
配置文件内容<文件名:properties.properties>:
person=entity.PersonInstanceTest
接口:
package iInterface;
public interface IPerson {
public void setAge(int age);
public void setName(String name);
public void setAddress(String address);
public int getAge();
public String getName();
public String getAddress();
public String sayHello(String name);
public String sayGoodBye(String name);
}
接口实现类:
package entity;
import iInterface.IPerson;
public class PersonInstanceTest implements IPerson{
private int age;
private String name;
private String address;
public PersonInstanceTest() {
System.out.println("--对象被实例化啦!--");
}
public PersonInstanceTest(int age,String name,String address){
this.age = age;
this.name = name;
this.address = address;
}
@Override
public int getAge() {
return 0;
}
@Override
public String getName() {
return null;
}
@Override
public String getAddress() {
return null;
}
@Override
public String sayHello(String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public String sayGoodBye(String name) {
return null;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "age: " + age + " name: " + name + " address: " + address;
}
}
创建类实现工具类:
package reflect;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
/***
* 面向接口编程:
* newInstance() 和 new 有什么区别?
* 1、区别在于创建对象的方式不一样,前者是使用类加载机制
* 2、从jvm的角度看,我们使用new的时候,这个要new的类可以没有加载;
* 3、使用newInstance时候,就必须保证:
* 1、这个类已经加载;
* 2、这个类已经连接了。
* 而完成上面两个步骤的正是class的静态方法forName()方法,这个静态方法调用了启动类加载器(就是加载javaAPI的那个加载器)。
* 即:newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化
*
* [补充:]
*newInstance: 弱类型。低效率。只能调用无参构造。
*new: 强类型。相对高效。能调用任何public构造。
*newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。
* @author huawei
*
*/
public class ClassReflect {
private static Properties props;
//采用静态语句块:类加载便会执行
static{
props = new Properties();
try {
String path = "src" + File.separator + "file" + File.separator + "properties.properties";
props.load(new FileInputStream(path));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//调用类无参构造器
public static Object createInstance(Object className)
throws ClassNotFoundException, InstantiationException,
IllegalAccessException, IllegalArgumentException,
SecurityException, InvocationTargetException,
NoSuchMethodException{
String object = (String) props.get(className);
Class<?> cls = Class.forName(object);
return cls.getConstructor().newInstance();
}
//调用有参构造器
public static Object createInstance(Object className,Class<?>[] parameterTypes,Object[] initargs) throws Exception{
String object = (String) props.get(className);
Class<?> cls = Class.forName(object);
return cls.getConstructor(parameterTypes).newInstance(initargs);
}
}
调用不同参数构造器测试类:
package reflect;
import org.junit.Test;
import iInterface.IPerson;
/***
* 创建类的实例测试类:--实现面向接口编程思想
* 1、调用无参构造器
* 2、调用有参构造器
* @author huawei
*
*/
public class ClassInstanceTest {
//调用无参构造器
//@Test
public void test1(){
try {
IPerson person = (IPerson) ClassReflect.createInstance("person");
person.setName("beyond0851");
person.setAge(100);
person.setAddress("hello");
System.out.println(person.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//根据参数类型不同,调用有参构造器
@Test
public void test2(){
try {
IPerson person = (IPerson) ClassReflect.createInstance("person",
new Class[]{int.class,String.class,String.class},
new Object[]{90,"beyond0851","love记记"});
System.out.println(person.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
相关推荐
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作这些数据的方法封装在一起。在Python中,面向对象编程是其核心特性之一,使得代码更加模块化,易于维护和...
- 动态创建对象:newInstance()方法,获取构造器并创建对象。 - 访问成员:获取和设置字段,调用方法。 8. **网络编程**: - Socket编程:客户端和服务端的建立连接,数据传输。 - URL和URLConnection:访问...
obj = (Object) cls.newInstance(); } catch (ClassNotFoundException cnfe) { System.out.println("ClassNotFoundException: " + cnfe.getMessage()); } catch (Exception e) { e.printStackTrace(); } ...
4. 对面向接口编程的理解和应用实例。 5. 对实验的反思和对未来学习的规划。 附:实验报告样例通常会包含实验环境的配置、代码实现、测试结果、问题分析及改进方案等详细内容,以供教师评估和同学参考。
在Java编程语言中,`new`关键字扮演着至关...`new`更直接,适用于常规对象创建,而`newInstance()`适合于需要动态性和灵活性的场合,如依赖注入和面向接口编程。理解这些概念对于编写健壮且可维护的Java代码至关重要。
面向对象编程(Object-Oriented Programming,OOP)是软件开发中的一个重要概念,通过封装、继承和多态性等原则,提高代码的重用性和模块化。 在JavaScript中,虽然原生支持函数作为一等公民,可以模拟面向对象的...
3. **newInstance()**:通过Class对象的newInstance()方法,我们可以实例化一个类,无需知道其构造函数的签名。 4. **Method和Constructor类**:Method类表示类的方法,Constructor类表示类的构造器。通过这两个类...
`newInstance()`的这种分步操作使我们可以在不明确具体类的情况下创建对象,适应了面向接口编程和配置驱动的设计模式。 总结起来,`new`关键字是Java中创建对象的基本手段,而`newInstance()`则提供了更高级的动态...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受青睐。在Java面试中,面试官通常会关注候选人的基础知识、编程能力、问题解决技巧以及对框架和最佳实践的理解。这份“最全的Java面试...
在PHP编程语言中,面向对象程序设计(Object-Oriented Programming, OOP)是一种重要的编程范式,它允许我们以更接近现实世界的方式来组织代码,提高可读性、可维护性和复用性。本篇文章将深入探讨PHP中的对象生成...
- 类加载:了解Class类及其方法,如forName()、newInstance()等。 - 动态类型:理解动态获取类信息、构造函数、方法和字段的方法。 - 动态代理:学习如何使用java.lang.reflect.Proxy创建动态代理类。 8. **网络...
- 构造器的反射调用:newInstance()方法。 - 方法和字段的反射操作:getMethod()、getField()等。 9. **枚举和注解**: - 枚举类型:定义枚举类,枚举常量。 - 注解:定义注解,元注解,使用注解进行代码分析和...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者喜爱。在准备Java面试时,了解并掌握Java的基础知识以及常见考点是至关重要的。以下是一些核心的Java知识点和面试考点: 1. *...
- 动态创建对象:newInstance()方法。 - 访问私有成员:通过setAccessible(true)绕过访问限制。 10. **JVM**: - 类加载机制:双亲委派模型,自定义类加载器。 - 类加载过程:加载、验证、准备、解析和初始化。...
- 动态创建对象:newInstance()方法。 - 访问私有成员:getDeclaredField(),setAccessible()等方法。 10. **JDBC**: - 数据库连接:DriverManager,Connection,Statement,PreparedStatement。 - SQL操作:...
- 创建对象:newInstance()方法和Constructor的使用。 - 访问和修改成员:获取和设置字段、调用方法。 8. **设计模式**: - 单例模式:了解多种实现方式及其优缺点。 - 工厂模式:简单工厂、工厂方法和抽象工厂...
- 动态创建对象和调用方法:newInstance(),getMethod(),invoke()。 11. **设计模式** - 常见设计模式:工厂模式、单例模式、装饰器模式、观察者模式、适配器模式等。 - 设计原则:开闭原则、里氏替换原则、...
描述中提到的"SDK"(Software Development Kit)封装,意味着将单例模式应用于开发工具包中,为开发者提供统一的接口来访问和操作SDK的功能。这样的设计可以使得SDK的使用更加简单和一致,降低用户的使用难度,同时...
面向对象编程(Object-Oriented Programming,简称OOP)将现实世界中的事物抽象为类(Class),然后通过类来创建对象(Instance),以此来模拟真实世界的实体及其相互关系。 1.1 面向对象与面向过程的区别: 面向...