文档章节

Java反射学习总结一(基础篇)

__HuWei
 __HuWei
发布于 2017/09/12 15:59
字数 963
阅读 5
收藏 0

Class类是Reflection API中核心的类,他位于java.lang.Class

列出一些常用的方法。

- getName() : 获得类的完整名字

- getFields() : 获得类的public类型的属性

- getDeclaredFields() : 获得类的所有属性

- getMethods() : 获得类的public类型的方法

- getDeclaredMethods() : 获得类的所有方法

- getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)

- getConstructors() : 获得类的public类型的构造方法

- getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)

- newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象

 

如果想使用反射,有2个关键的部分

1.获取Class对象

2.获得对象实例

下面来介绍这两个部分:

 

 

1.如何获取Class对象

获取某个类或某个对象所对应的Class对象的常用的3种方法

a) 使用Class类的静态方法forName:       

  Class.forName("java.lang.String");

b) 使用类的.class语法: 

   String.class;

c) 使用对象的getClass()方法(java.lang.Object类中的方法): 

   String s = "aa"; 

   Class<?> clazz = s.getClass();

 

2.如何获得对象实例

大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法

这里将调用构造方法参数的不同分为两种类型:

a)调用无参数的构造方法:

1.调用Class对象的newInstance()方法:

Class<?> classType = ClassClass.forName("java.lang.String");

Object object = classTpye.newInstance();

         2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:

Class<?> classType = ClassClass.forName("java.lang.String");

Constructor cons = classType.getConstructor(new Class[]{});  

Object object =cons.newInstance(new Object[]{});

 

b)调用有参数的构造方法:

1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:

Class<?> classType = ClassClass.forName("java.lang.String");

Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});

  Object object = cons.newInstance(new Object[]{"hello",3});

 

下面来一个小Demo,由于过于简单这里就只贴代码了

这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:

 

package com.hwcode.pojo;

public class Person {

	private String userName;
	
	private String userAge;
	
	private String userAddress;
	
	private String userAuto;
	
	public Person(){}

	public Person(String userName, String userAge, String userAddress, String userAuto) {
		this.userName = userName;
		this.userAge = userAge;
		this.userAddress = userAddress;
		this.userAuto = userAuto;
	}

	@Override
	public String toString() {
		return "Person [userName=" + userName + ", userAge=" + userAge + ", userAddress=" + userAddress + ", userAuto="
				+ userAuto + "]";
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserAge() {
		return userAge;
	}

	public void setUserAge(String userAge) {
		this.userAge = userAge;
	}

	public String getUserAddress() {
		return userAddress;
	}

	public void setUserAddress(String userAddress) {
		this.userAddress = userAddress;
	}

	public String getUserAuto() {
		return userAuto;
	}

	public void setUserAuto(String userAuto) {
		this.userAuto = userAuto;
	}
	
	private void getUserNameAndUserAge(){
		System.out.println("userName : " + this.userName + "\nuserAge : " + this.userAge);
	}
}

很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString

下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果

package com.hwcode.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {

	public static void main(String[] args) {
		try {
			// 构造方法不是私有用以下方法
			// Person person = new Person();
			// Class<? extends Person> personClass = person.getClass();
			// 构造方法私有用以下方法
			// 获取Person类的Class对象
			Class<?> classType = Class.forName("com.hwcode.pojo.Person");
			Constructor constructor = classType
					.getConstructor(new Class[] { String.class, String.class, String.class, String.class });
			Object object = constructor.newInstance(new Object[] { "Dean", "25", "我的住址", "阳光帅气" });

			// 获取setUserName方法
			Method setId = classType.getMethod("setUserName", new Class[] {String.class });

			// 调用setUserName方法设置UserName
			setId.invoke(object, new Object[] { "凯文" });

			// 调用toString输出结果
			Method toString = classType.getMethod("toString", new Class[] {});
			String result = (String) toString.invoke(object, new Object[] {});
			System.out.println(result);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

输出结果为:Person [userName=凯文, userAge=25, userAddress=我的住址, userAuto=阳光帅气]

最近正在看反射的视频和资料,写这个博文的目的就是对于学习的一个总结吧。

陆续可能会更新一些我总结的更深层的反射知识,希望大家支持

© 著作权归作者所有

共有 人打赏支持
__HuWei
粉丝 1
博文 14
码字总数 18983
作品 0
深圳
程序员
你所需要的java提升篇大总结

java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序的深入解析 java基础(五) Str...

sihailoveyan
04/25
0
0
慕课分享:盘点2014年热门免费开发课程

这篇文章来自慕课网团队的分享,文章从前端开发、后端开发、移动开发和OS 四个方面,分享了2014年度的热门免费课程。 前端开发 《HTML+CSS基础课程》 这门课程从最基本的概念开始讲起,步步深...

2014/12/30
0
0
安卓开发必备知识体系:Java篇

大家好我是张拭心,自从各位朋友帮点广X开始,我发现我每天更有奔头了,走起路来也更有劲了,说啥也得更新的勤快一点。不过放心,我一定推送有价值的内容给大家,还请朋友们照旧动动手指点点...

d29h1jqy3akvx
05/10
0
0
如果你想学习Java,那么就来看这篇文章

一、前言 我是从大二开始学习的Java,当时的目标是Java Web开发,当时并不想考研,所以当时的学习是以就业为主,现在我大三了,学习Java Web开发已经一年了,因为种种原因,决定要考研,所以...

Jivanmoon
08/27
0
0
JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52724939 JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千! 经过了几...

Aduroidpc
2016/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链入门教程以太坊源码分析ethdb源码分析

兄弟连区块链入门教程以太坊源码分析ethdb源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退...

兄弟连区块链入门教程
28分钟前
1
0
Eclipse下忽略掉node_modules目录相关配置

https://blog.csdn.net/yzf913214/article/details/72872523

张宏亮1982
29分钟前
2
0
在Python-dataframe中如何把出生日期转化为年龄?

我们在做数据挖掘项目或大数据竞赛时,如果个体是人的时候,获得的数据中可能有出生日期的Series,举个简单例子,比如这样的一些数: # -*- coding: utf-8 -*- import pandas as pd from ...

Mr_zebra
32分钟前
5
0
Android入门—activity生命周期

activity生命周期如下所示: onCreate()方法 创建activity时使用onStart()方法 当activity界面变为用户可见时调用onResume()方法 当activity界面获取到焦点时调用(界面按钮可点击,...

haoyuehong
34分钟前
1
0
使用C++ Builder 6编译产生错误

错误提示: [C++ Error] E2075 Incorrect project override option: Files\Borland\CBuilder6\lib\vcl60.csm[C++ Error] E2075 Incorrect project override option: Files\Borland\CBuilde......

simpower
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部