反射动态的创建对象的两种方式

一种是通过默认的构造器通过Class的newInstance()方法来获取

另一种是通过指定的构造器来创建

import java.lang.reflect.Constructor;

public class ReflectDemo2 {

    public static void main(String[] args) throws Exception {

        /*
         * 如何根据给定名称获取到指定的Class对象后建立该类的对象呢?
         */

//        getObject_1(); //通过默认构造器new对象

//        getObject_2(); //通过指定构造器new对象

    }

    public static void getObject_2() throws Exception {

        String className = "cn.qujianlei.domain.Person";
        Class clazz = Class.forName(className);

        /*
         * 万一给定类中没有空参数的构造方法呢?
         * 可以先获取指定的构造方法,再通过该构造方法进行实例化
         */

        //1.通过Class获取指定构造方法,比如带两个参数
        Constructor cons =clazz.getConstructor(String.class,int.class);//拿的是公有的

//        System.out.println(cons);

        //2.通过指定的构造器对象进行对象的初始化。
        Object obj = cons.newInstance("lisisi",23);
    }

    public static void getObject_1() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        //1.根据给定的类名获取Class对象。
        String className = "cn.qujianlei.domain.Person";
        Class clazz = Class.forName(className);
        Object obj = clazz.newInstance();//创建了一个Person对象,默认调用该类的空参数构造方法
        //记住:一般被反射的类通常都有空参数的构造方法。
        //java.lang.InstantiationException  没有调用到与之对应的构造方法

    }

}
public class Person {

    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Person() {
        super();
        System.out.println("person run");

    }

    public void show(){
        System.out.println("person show run");
    }

    public static void staticShow(){
        System.out.println("person static show run");
    }

    public void paramShow(String name,int age){
        System.out.println("show:"+name+"---"+age);
    }

}
时间: 2024-11-08 19:19:05

反射动态的创建对象的两种方式的相关文章

Java反射获取class对象的三种方式,反射创建对象的两种方式

Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName 静态方法. 前提:已明确类的全路径名. 第二种,使用 .class 方法. 说明:仅适合在编译前就已经明确要操作的 Class 第三种,使用类对象的 getClass() 方法. 适合有对象示例的情况下 package com.reflection; /** * Created by Liuxd

浅谈创建对象的两种方式

经常使用IDE不容易看出编译和运行的明显区别,因为像eclipse这样的开发工具会自动进行编译.当你创建一个类的时候就编译成一个class文件,在此基础上做的修改保存后又会触发一次编译.所以我们可以借助记事本来看看什么是运行时调用,来体验一下创建对象的两种方式. 首先来看一个例子,有以下的接口和两个实现类: public interface Fruit { public void color(); } public class Apple implements Fruit { @Override

java动态获取WebService的两种方式(复杂参数类型)

java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_FlightOrderSearchRequest request) { Object myAllMessage; OrderSearchListRes response = null; try { String endpoint = carGlobalSetting.getEndpoint(); JaxWsD

创建对象的两种方式

一.通过加载类机制创建对象 主要过程: 1 String str = "asdf" ; 2 Class t = Class.forName(str); 3 Object obj = t.newInstance(); 先来认识一下Class.forName(): Class.forName(xxx)返回的是名字为xxx的一个类,利用反射机制. Class.forName(xxx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段. 接着使用newInstance方

java 创建对象的两种方式

一: Object object = new Object(); 二: public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { //可以通过映射的方式来获取 DemoTest2 myobject = (DemoTest2)Class.forName("DemoTest2").newInstance(); m

Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=ABCMeta): @abstractmethod def send(self,subject,body,to,name): pass 方式二 class BaseMessage(object): def send(self, subject, body, to, name): raise NotImp

实现动态代理的两种方式介绍+例子demo(JDK、CGlib)

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢? 这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑. JDK动态代理与CGLib动态代理均是实现Spring AOP的基础. 一.JDK这种方式动态代理 1. 没引入spring配置文件时,怎么实现JDK动态代理 情景介绍:如何解决全站中文乱码问题? 我们会定义一个过滤器:Character

动态加载dex的两种方式

DexClassLoader 加载的类是没有组件生命周期的,也就是说即使DexClassLoader通过对dex的动态加载完成了对组件的加载,当系统启动该组件时,还会出现加载类失败的异常.有两种方式可以解决上面出现的问题: 方法一:http://blog.csdn.net/androidsecurity/article/details/8809542,更改系统的classloader使其为自定义的加载器. 特点:两个dex具有明显的分割线,第一个dex只起启动作用,后面不会出现第一个dex的类加

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路