java反射中的newInstance的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射中的newInstance的使用相关的知识,希望对你有一定的参考价值。

代码如下
class A
private int i;

public void set(int i)
this.i=i;

public int get()
return this.i;



class Test01

public static void main(String args[])

Class c=null;
try
c=Class.forName("A");//创建了A类的Class对象
catch(ClassNotFoundException e)
System.out.println("ClassNotFoundException");
System.exit();


//利用A类的Class对象来创建A类的实例对象
Object obj=null;
try
obj=c.newInstance();//obj指向的A类的对象
catch(InstantiationException e)
System.out.println("InstantiationException");

catch(IllegalAccessException e)
System.out.println("IllegalAccessException");

//obj.set(10);
//System.out.println(obj.get());


obj=c.newInstance();求问obj指向的是哪里?newInstance返回的类型只能使用Object接收?
请教大神解答下,谢谢,中金酬谢

class Test01

public static void main(String args[])

Class c = null;
try
c = Class.forName("A");// 创建了A类的Class对象
catch (ClassNotFoundException e)
System.out.println("ClassNotFoundException");


// 利用A类的Class对象来创建A类的实例对象
Object obj = null;
try
obj = c.newInstance();// obj指向的A类的对象
catch (InstantiationException e)
System.out.println("InstantiationException");
catch (IllegalAccessException e)
System.out.println("IllegalAccessException");

// obj.set(10); // 肯定不行的,Object咋会有这个方法呢?
// System.out.println(obj.get());

// 请这样,并且newInstance默认调用无参构造器,更多请google
A a = new A();
a.set(1);
System.out.println(a.get());

A aa;
try
aa = A.class.newInstance();
aa.set(2);
System.out.println(aa.get());
catch (InstantiationException e)
// TODO Auto-generated catch block
catch (IllegalAccessException e)
// TODO Auto-generated catch block


try
Class<?> Clazz = Class.forName("A");
A aaa = (A) Clazz.newInstance();
aaa.set(2);
System.out.println(aaa.get());
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
catch (InstantiationException e)
// TODO Auto-generated catch block
catch (IllegalAccessException e)
// TODO Auto-generated catch block


参考技术A 其实类就是一个对象么。object就是对象的意思。
object就是泛指所有的类,而我们常用的 A a = new A();这种写法就是具体化了。其实也可以写成Object ojb = new A();

newIntance()就是对象的实例化,返回的一个对象,如果知道具体对象的时很么的话,也可以直接用该对象来接受 A a = c.newInstance()追问

我也是这么认为的,但是为什么不能用obj访问我的get、set方法

参考技术B Object obj=Class.forName("A").newInstance();

这个obj就是A类的一个实例。
参考技术C class Test01

public static void main(String args[])

Class c = null;
try
c = Class.forName("A");// 创建了A类的Class对象
catch (ClassNotFoundException e)
System.out.println("ClassNotFoundException");


// 利用A类的Class对象来创建A类的实例对象
Object obj = null;
try
obj = c.newInstance();// obj指向的A类的对象
catch (InstantiationException e)
System.out.println("InstantiationException");
catch (IllegalAccessException e)
System.out.println("IllegalAccessException");

// obj.set(10); // 肯定不行的,Object咋会有这个方法呢?
// System.out.println(obj.get());

// 请这样,并且newInstance默认调用无参构造器,更多请google
A a = new A();
a.set(1);
System.out.println(a.get());

A aa;
try
aa = A.class.newInstance();
aa.set(2);
System.out.println(aa.get());
catch (InstantiationException e)
// TODO Auto-generated catch block
catch (IllegalAccessException e)
// TODO Auto-generated catch block


try
Class<?> Clazz = Class.forName("A");
A aaa = (A) Clazz.newInstance();
aaa.set(2);
System.out.println(aaa.get());
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
catch (InstantiationException e)
// TODO Auto-generated catch block
catch (IllegalAccessException e)
// TODO Auto-generated catch block


反射异常 java.lang.InstantiationException处理

查看这个InstantiationException:异常的api所说的是:

当应用程序试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。实例化失败有很多原因,包括但不仅限于以下原因:

  • 类对象表示一个抽象类、接口、数组类、基本类型、void
  • 类没有非 null 构造方法

 

是使用反射的时候编写使用class实例化其他类的对象的时候,一定要自己定义无参的构造方法。。。

  注意了,被反射的类显式的给出无参的构造方法。

以上是关于java反射中的newInstance的使用的主要内容,如果未能解决你的问题,请参考以下文章

java反射中的newInstance的使用

newInstance()和new()的区别

Spring IoC的原理为什么是反射而不是new

四:类加载机制

Java深拷贝与浅拷贝

类实例化原理