文档章节

通过java类反射获取类模板

Nick_Judy
 Nick_Judy
发布于 2015/10/04 20:54
字数 985
阅读 43
收藏 0

    在java语言中万事万物皆为对象,例如我们写一个person类那么我们就可以通过这个类来创造一些实例,这里的“实例”就是我们平时使用的对象。

public class Person {
	private String name;
	private int age;
	private String sex;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
}
ppublic class Referce {
	public static void main(String[] args) {
		Person wangwu=new Person();
		Person zhaosi=new Person();
		wangwu.setName("王五");
		wangwu.setAge(18);
		wangwu.setSex("male");
		
		zhaosi.setName("赵四");
		zhaosi.setAge(22);
		zhaosi.setSex("female");
	}
}

    在上面的代码中的“wangwu”、“zhaosi”就是我们所创造出来的对象,也就是说“Person”相当于一个模板,我们可以通过这个模板来创造“wangwu”、“zhaosi”这些具体的对象。举个通俗的栗子“Person”就相当于我们用来制作月饼的模具,“wangwu”、"zhaosi"就是我们能吃的月饼了。

    但人是一种喜欢思考的动物(所以智人才在尼安德特人 、鲁道夫人 、直立人等中被“自然选择”了出来,站到食物链顶端),那么我们不禁要想Person这个类模板是由谁创造的呢? 也就是说制作月饼模具的机床又在哪呢?

    那么下来就该我们的Class类粉墨登场了,它位于java.lang这个包下由于这个源码过长故在此贴出它的部分源码:

public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration,
                              Type,
                              AnnotatedElement {
    private static final int ANNOTATION= 0x00002000;
    private static final int ENUM      = 0x00004000;
    private static final int SYNTHETIC = 0x00001000;

    private static native void registerNatives();
    static {
        registerNatives();
    }

    /*
     * Private constructor. Only the Java Virtual Machine creates Class objects.
     * This constructor is not used and prevents the default constructor being
     * generated.
     */
    private Class(ClassLoader loader) {
        // Initialize final field for classLoader.  The initialization value of non-null
        // prevents future JIT optimizations from assuming this final field is null.
        classLoader = loader;
    }

    /**
     * Converts the object to a string. The string representation is the
     * string "class" or "interface", followed by a space, and then by the
     * fully qualified name of the class in the format returned by
     * {@code getName}.  If this {@code Class} object represents a
     * primitive type, this method returns the name of the primitive type.  If
     * this {@code Class} object represents void this method returns
     * "void".
     *
     * @return a string representation of this class object.
     */
    public String toString() {
        return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
            + getName();
    }

    我们可以看出它是一个final类(整个类都是final,就表明不希望从这个类被继承,不希望被修改)下面我们将具体操作这个类看看它是怎么来生产我们的类模具的。

public class Test {
	public static void main(String[] args) {
		Class<Person> clazz=Person.class;
		System.out.println(clazz.getName());
	}
}
输出结果是:com.tl.referce.Person

    从输出结果上我们可以看出这个clazz对象就是Person的类模具了,那么既然现在获取到了Person的类模具了那么是不是就可以利用它(clazz)来生产Person对象了呢?

public class Test {
	public static void main(String[] args) {
		Class<Person> clazz=Person.class;
		try {
			Person wangwu=clazz.newInstance();
			wangwu.setName("王五");
			wangwu.setAge(18);
			wangwu.setSex("male");
			System.out.println("姓名:"+wangwu.getName()+",年龄:"+wangwu.getAge()+",性别:"+wangwu.getSex());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}
输出结果是:姓名:王五,年龄:18,性别:male

    从输出结果我们可以看出,我们已经正确的拿到了Person类的类模具而且成功的利用这个模具创造出了“wangwu”这个对象。

    实际中我们还可以通过其他两种方法来获取Person类的类模具,下面我们来具体演示:

public class Test {
	public static void main(String[] args) {
		Person wangwu=new Person();
		Class<Person> clazz1=(Class<Person>) wangwu.getClass();
		System.out.println(clazz1.getName());
		System.out.println("=========================================");
		try {
			Class<Person> clazz2=(Class<Person>) Class.forName("com.tl.referce.Person");
			System.out.println(clazz2.getName());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

输出结果:
com.tl.referce.Person
=========================================
com.tl.referce.Person

    从输出结果可以看出这三种方法都可以获取Person类的类模具,“wangwu.getClass()”这种方法是我们通过一个具体的对象来获取类模具,相当于通过一个五仁月饼来反向制造出五仁月饼的具。“Class.forName("com.tl.referce.Person")”相当于我们把一个生产模具的图纸来交给机床,机床根据这个图纸来生产对应的模具。

© 著作权归作者所有

Nick_Judy
粉丝 4
博文 8
码字总数 3423
作品 0
深圳
程序员
私信 提问
老司机带你深入浅出Java反射

反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息 这里笔者就深入浅出总结下Java反射,...

小刀爱编程
2018/11/07
0
0
Java基础之反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道...

Java-老刘
2018/05/15
0
0
【免费】全网独家:详解Java反射机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/silencezwm/article/details/85115991 【免费】全网独家:这是一份非常值得珍藏的Android知识体系!!! 本文...

silencezwm
2018/12/20
0
0
夯实 Java 基础 - 反射

夯实 Java 基础 - 反射 自嵌套 Fragment 懒加载文章至今已经已经一个星期过去了,说实话最近对于学习的热情有点衰减,也可能是自己有点飘了,也有可能是现实中的诱惑多了点,但是这是个不好的...

群星纪元
03/31
0
0
Gson通过反射将Json转化为java对象

Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。 然后我们先写一个demo来用Gson将一个json转化...

woshixin
04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
5分钟前
0
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
21分钟前
0
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
今天
1
0
今天的学习

今天学到了<select></select>标签: <label for="unittype">Select unit type: </label><select id="unittype" name="unittype" autofocus > <option value="1"> Miner </option> ......

墨冥
今天
1
0
程序员随想-关于分享

最早的时候,文字是贵族这些上层人士才会学习的,底层人士没有资格和渠道去学习,同样用文字、图像等其他载体承载的知识大部分也只有贵族阶层才能享受的。后来有了造纸术、印刷术,成本降低,...

Lubby
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部