Class对象的生成方式
1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名)
2.类名.class
3.实例对象.getClass()
Class.forName、实例对象.class(属性)、实例对象getClass()的区别:
1)Class cl=A.class; JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象
2)Class cl=对象引用o.getClass();返回引用o运行时真正所指的对象(因为:儿子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
3)Class.forName("类名"); JAVA人都知道.装入类A,并做类的初始化
附:
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1、这个 类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。
现在可以看出,Class对象的newInstance()(这种用法和Java中的工厂模式有着异曲同工之妙)实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
实例对象的创建四种方式
public class CreateObj implements Cloneable,Serializable{
private static String filename = CreateObj.class.getResource("").getPath()+ "/obj.txt";
static File file = new File(filename);
static {
if (!file.exists())
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
// 1.第一种常用方式 (用new语句创建对象)
CreateObj s1 = new CreateObj();
System.out.println(s1);
// 2.第二种方式 静态方式 java.lang.InstantiationException (运用反射手段)
CreateObj s2 = (CreateObj) Class.forName( "com.newland.commons.collectionutil.CreateObj").newInstance();
System.out.println(s2);
//第三种方式 用对象流来实现 前提是对象必须实现 Serializable (运用反序列化手段)
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
new FileOutputStream(filename));
objectOutputStream.writeObject(s2);
ObjectInput input=new ObjectInputStream(new FileInputStream(filename));
CreateObj s3 = (CreateObj) input.readObject();
System.out.println(s3);
//第四种 必须 实现Cloneable接口 否则抛出CloneNotSupportedException(调用对象的clone()方法)
CreateObj obj=new CreateObj();
CreateObj s4= (CreateObj) obj.clone();
System.out.println(s4);
}
}
Class对象和实例对象的区别与联系:
任何 Java 的类或接口都是 Class 类的一个实例,反射就是 Java 自我管理这些(类、对象)的机制
Class对象的作用(应用):
1、可以通过反射机制发现对象的类型,发现类型的方法/属性/构造器
Class cls =obj.getClass();
Field[] fields =cls.getDeclaredFields(); //获取该类的所有属性
for(Field field : fields){
field.getType(); //属性类型
field.getName(); //属性名称
}
Method[] methods = cls.getDeclaredMethods();//获取该类的所有方法
for(Method method : methods){
method.getReturnType(); //方法类型
method.getName(); //方法名称
}
Constructor[] constructors = cls.getDeclaredConstructors();//获取该类的所有构造器
for(Constructor constructor : constructors){
constructor .getName(); //构造器名称
}
2、可以创建对象并访问任意对象方法和属性等
Class<Date> date=Class.forName("类文件名"); //加载指定的类文件,获得一个Class对象
Date d=date.newInstance(); //由Class对象获得一个新实例对象(默认调用类的无参构造器)
public Object getFieldValue(Object obj , String fieldname){
Class cls = obj.getClass(); //反射出类型
Field field = cls.getDeclaredField(fieldname); //反射出类型属性
Object val =field.get(obj); //在对象obj上读取field属性的值
return val;
}
在对象obj上调用方法签名是(method ,paramTypes)的方法,params是传递的参数,有方法返回,无返回null
public Object getMethod(Object obj , String method , Class[] paramTypes , Object[] params){
Class cls = obj.getClass(); //反射出类型
Method m= cls.getDeclaredMethod(method , paramTypes); //反射出类型方法
Object val =m.invoke(obj , params); //在对象obj上调用方法m,传递参数类别params
return val;
}
相关推荐
java在创建对象的时候使用的创建对象可以用到很多模式,比如工厂模式。。。反射。。等等
java性能调优-jvm创建对象和-performance-createobj-allocationmemory
详细总结了java中创建对象的不同方式和String创建对象的不同方式
2022/2/23 上午9:4018 - MethodVisitor创建对象 - 简书- MethodVisitor创建对象舍是境界. .. 字数 阅读linu
内容概要: 本文档详细介绍了Java编程中对象的创建和使用,并对对象在内存中的分配和使用进行了详细分析。通过示例代码和详细解释,帮助读者理解对象的创建过程、内存分配和使用方法。 能学到什么: 理解对象的...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
计算机后端-Java-Java核心基础-第15章 面向对象07 17. 创建接口匿名实现类的对象.avi
计算机后端-Java-Java核心基础-第15章 面向对象07 10. 创建抽象类的匿名子类对象.avi
本项目基于java创建xml文档对象,方便对xml文档的读写。
Java 基础核心总结 - Java 基础核心总结 - Java 概述 - 什么是 Java? - Java 的特点 - Java 开发环境 ... - 类也是一种对象 - 对象的创建 - 属性和方法 - 构造方法 - 方法重载 - 方法的重写 -
Java试题-5:应用反射创建对象,调用对象方法 反射为Java的高级技术应用
Java创建对象的四种方法.doc
内容概要: 本文详细演示了如何在Java中创建对象并使用对象的方法。通过使用集成开发环境MyEclipse,创建了一个Java项目并展示了对象的创建、属性的定义和方法的调用的步骤。 能学到什么: 学习如何在Java中创建...
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
Java 创建对象的五种方式 使用 new 来创建对象 使用 newInstance 方法来创建 使用反射来创建对象 使用对象克隆来创建对象 使用反序列化创建对象
这是我用于测试,主要用于jni创建java对象病操作
(5) 通过快递任务类变量, 访问 send ()方法, 以创建的专用交通工具类对象、 手机类对象为实参,输出快递送货信息。 (6)通过快递任务类变量,访问 sendAfter()方法,输出送货后信息。 输出总效果如下图所示。
8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java...
详细介绍java对象的创建过程,以致对java基础详细的掌握!
Java和C++都是面向对象的编程语言,然而Java和C++在创建对象时却存在不同的方式,由于方式的不同导致在内存中管理的不同。 1、C++创建对象方式 在C++中我们可以采用如下两种方式来创建对象, 1 Dog ...