【Java反射机制】_Class类的使用笔记

【Java反射机制】_Class类的使用笔记

本章目标:
可以使用Class类完成对象的实例化操作
可以通过Constructor类调用有参构造方法完成对象的实例化操作

具体内容:
Class主要是反射的源头,不光可以取得对象所在类的信息,也可以直接通过Class类的方法进行对象的实例化操作正常情况下,使用关键字new 为对象实例化,如果现在已经实例化好了Class对象,则就可以通过Class类中提供的

public T new Instance()throws InstantiationException,IllegalAccessException
实例化对象

package org.lxh.demo15.instancedemo;
class Person{
    private String name;
    private int age;
    public void setName(String name){
        this.name = name;    
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return this.name;
    }
    public int getAge(){
        return this.age;
    }
    public String toString(){
        return "姓名:"+this.name+",年龄:"+this.age;
    }
}
public class InstanceDemo01{
    public static void main(String[] args){
        Class<?> c = null;    //声明Class对象
        try{
            c = Class.forName("org.lxh.demo15.instancedemo.Person");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        Person per = null;    //声明Person对象
        try{
            per = (Person)c.newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }
        per.setName("李兴华");        //设置姓名
        per.setAge(30);            //设置年龄
        System.out.println(per);    //内容输出,调用toString
    }
}


通过以上的代码,可以发现,即使不使用关键字new对象也可以进行实例化操作,反射的作用。
但是,在使用以上操作的时候有一点必须注意,在操作中类中必须存在无参构造方法。否则无法实例化。

package org.lxh.demo15.instancedemo;
class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.setName(name);
        this.setAge(age);
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return this.name;
    }
    public int getAge(){
        return this.age;
    }
    public String toString(){
        return "姓名:"+this.name+",年龄:"+this.age;
    }
};
public class InstanceDemo02{
    public static void main(String args[]){
        Class<?> c = null;
        try{
            c = Class.forName("org.lxh.demo15.instancedemo.Person");
        }catch(ClassNotFoundException e){
            e.printStackTrace();        
        }
        Person per = null;    //声明person对象
        try{
            per = (Person)c.newInstance();    //实例化对象
        }catch(Exception e){
            e.printStackTrace();
        }
        per.setName("牛儿吃草");    //设置姓名
        per.setAge(30);            //设置年龄
        System.out.println(per);    //内容输出,调用toString
    }
}


出现以下错误:
java.lang.InstantiationException:org.lxh.demo15.instancedemo.Person

所以说,发现,使用以上的方式实际上还是需要类中构造方法的支持,符合于对象的实例化要求。
如果要想解决这样的的问题,则必须明确的指定要调用的构造方法,半传递参数。但是从实际的开发角度来讲,一般使用反射实例化对象的时候,类中都最好存在一个无参构造,这样的操作比较合理。
如果要想调用有参,则必须按照以下的步骤进行:


操作的注意:被实例化对象的类中必须存在无参构造方法,如果不存在的话,则肯定是无法实例化的。
对于以上的程序也并非没有解决的方法,也是可以通过其他的方式进行实例化操作的,只是在操作的时候需要明确的调用类中的构造方法,并将参数传递进去之后才可以进行实例化操作,操作步骤如下:

1、通过Class类中的getConstructors()取得本类的全部构造方法。
2、向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。
3、之后通过Constructor实例化对象。

在Constructor类中存在一个方法:

public T newInstance(Object... initargs)
         throws instantiationException,
            IllegalAccessException,
            IllegalArgumentException,
            InvocationTargetException
传递初始化参数,以进行对象的实例化操作。




明确调用有参构造,实例化对象:

package org.lxh.demo15.instancedemo;
import java.lang.reflect.Constructor;
class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.setName(name);
        this.setAge(age);        
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return this.name;
    }
    public int getAge(){
        return this.age;
    }
    public String toString(){
        return "姓名:"+this.name+",年龄:"+this.age;
    }
}
public class InstanceDemo03{
    public static void main(String args[]){
        Class<?> c = null;
        try{
            c = Class.forName("org.lxh.demo15.instancedemo.Person");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        Person per = null;    //声明Person对象
        Constructor<?> cons[] = null;
        cons = c.getConstructors();
        try{
            per = (Person) cons[0].newInstance("李兴华",30);    //实例化对象
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(per);    //内容输出,调用toString()
    }
}


但是,从实际角度看,如果要使用反射进行对象的实例化操作,最好在类中存在无参构造。

总结:
1、本章的功能是Class用的最多的功能,而且在开发中用户也会经常使用到的开发模式
2、在使用Class 实例化对象,必须保证类中存在一个无参构造,否则无法使用。
3、如果要想调用有参构造进行对象的实例化操作,则必须使用Constructor类完成,此类表示构造方法,并通过可变参数传递要求的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的影城管理系统,源码+数据库+论文答辩+毕业论文+视频演示 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多生活之中,随之就产生了“小徐影城管理系统”,这样就让小徐影城管理系统更加方便简单。 对于本小徐影城管理系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据小徐影城管理系统的现状来进行开发的,具体根据现实的需求来实现小徐影城管理系统网络化的管理,各信息有序地进行存储,进入小徐影城管理系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、用户管理、电影型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台;首页、电影信息、电影资讯、个人中心、后台管理、在线客服等功能。 本论文主要讲述了小徐影城管理系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的小徐影城管理系统状况,提高管理效率。 关键词:小徐影城管理系统;Spring Boot框架,MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

e421083458

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

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

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

打赏作者

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

抵扣说明:

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

余额充值