文档章节

java 反射

 非想非非想
发布于 2017/05/11 13:43
字数 1153
阅读 4
收藏 0

1.   ReflectEntity.java

package my.java.reflect;

public class ReflectEntity {
	//属性
	private int id;
	
	protected String name;
	
	public int age;
	
	String address;
	
	public static String sex;
	
	public ReflectEntity() {
		System.out.println("public 无参数构造器");
	}

	public ReflectEntity(int id, String name, int age, String address) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.address = address;
		System.out.println("public 带参数构造器");
	}
	
	@SuppressWarnings("unused")
	private ReflectEntity(int id){
		System.out.println("private 构造器");
	}
	
	@SuppressWarnings("unused")
	private String getName(String name) {
		this.name = name;
		System.out.println("private 无参数 方法 name = "+name);
		return this.name;
	}
	
	public int getId() {
		System.out.println("public 无参数 方法");
		return this.id;
	}
	
	public int getId(int id) {
		this.id = id;
		System.out.println("public 带参数 方法"+id);
		return this.id;
	}
	
	public String getAddress(String address){
		this.address = address;
		System.out.println("public 带参数方法");
		return address;
	}
	
	public static void sex() {
		System.out.println("public static 无参数方法");
	}
	
	public static void sex(String sex) {
		ReflectEntity.sex = sex;
		System.out.println("public static 带参数方法" + sex);
	}

	@Override
	public String toString() {
		return "ReflectEntity [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
}

2.   MyReflect01.java

package my.java.reflect;

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

public class MyReflect01 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, NoSuchFieldException, ClassNotFoundException {
		
		Class<ReflectEntity> clazz = ReflectEntity.class;
		//Class clazz = Class.forName("my.java.reflect.ReflectEntity");
		System.out.println("getName :" + clazz.getName());
		System.out.println("getClassLoader :" + clazz.getClassLoader());
		//所有的public属性
		System.out.println("-----所有的public属性-----");
		Field[] fields = clazz.getFields();
		for(Field field : fields){
			System.out.println(field);
		}
		//所有的public指定属性
		System.out.println("-----所有的public指定属性-----");
		Field fieldsP = clazz.getField("age");
		System.out.println(fieldsP);
		
		//所有的声明的属性
		System.out.println("-----所有的声明的属性-----");
		Field[] fieldsD = clazz.getDeclaredFields();
		for(Field field : fieldsD){
			System.out.println(field);
		}
		
		//所有的声明的指定属性
		System.out.println("-----所有的声明的指定属性-----");
		Field fieldsP1 = clazz.getDeclaredField("address");
		System.out.println(fieldsP1);
		
		//所有自己声明的构造器
		System.out.println("-----所有自己声明的构造器-----");
		Constructor[] consD = clazz.getDeclaredConstructors();
		for(Constructor c : consD){
			System.out.println(c);
		}
		
		//全部public构造器
		System.out.println("-----所有 public 构造器-----");
		Constructor[] cons = clazz.getConstructors();
		for(Constructor c : cons){
			System.out.println(c);
		}
		//指定的构造器
		System.out.println("-----指定 构造器-----");
		Constructor constructor = clazz.getConstructor(int.class,String.class,int.class,String.class);
		System.out.println(constructor);
		
		//指定自己声明的构造器
		System.out.println("-----指定自己声明的 构造器-----");
		Constructor constructorD = clazz.getDeclaredConstructor(int.class);
		System.out.println(constructorD);
		
		//构造器参数
		System.out.println("-----构造器参数-----");
		Parameter[] parameters = constructor.getParameters();
		for(Parameter parameter : parameters){
			System.out.println(parameter);
		}
		
		//所有自己声明的方法
		System.out.println("-----所有自己声明的方法-----");
		Method[] methodsD = clazz.getDeclaredMethods();
		for(Method method : methodsD){
			System.out.println(method);
		}
		
		//所有自己声明的指定方法
		System.out.println("-----所有public指定的 方法-----");
		Method methodP1 = clazz.getDeclaredMethod("getId");
		System.out.println("指定的方法 : "+methodP1);
		
		//所有public方法
		System.out.println("-----所有  public 方法-----");
		Method[] methods = clazz.getMethods();
		for(Method method : methods){
			System.out.println(method);
		}
		
		//所有public指定的方法
		System.out.println("-----所有public指定的方法-----");
		Method method2 = clazz.getMethod("getId", int.class);
		System.out.println("指定的方法 : "+method2);
		
		//方法的所有参数
		System.out.println("-----方法的所有参数-----");
		Parameter[] parameters1 = method2.getParameters();
		for(Parameter parameter : parameters1){
			System.out.println(parameter);
		}
	}
}

执行结果:

getName :my.java.reflect.ReflectEntity
getClassLoader :sun.misc.Launcher$AppClassLoader@73d16e93
-----所有的public属性-----
public int my.java.reflect.ReflectEntity.age
public static java.lang.String my.java.reflect.ReflectEntity.sex
-----所有的public指定属性-----
public int my.java.reflect.ReflectEntity.age
-----所有的声明的属性-----
private int my.java.reflect.ReflectEntity.id
protected java.lang.String my.java.reflect.ReflectEntity.name
public int my.java.reflect.ReflectEntity.age
java.lang.String my.java.reflect.ReflectEntity.address
public static java.lang.String my.java.reflect.ReflectEntity.sex
-----所有的声明的指定属性-----
java.lang.String my.java.reflect.ReflectEntity.address
-----所有自己声明的构造器-----
private my.java.reflect.ReflectEntity(int)
public my.java.reflect.ReflectEntity(int,java.lang.String,int,java.lang.String)
public my.java.reflect.ReflectEntity()
-----所有 public 构造器-----
public my.java.reflect.ReflectEntity(int,java.lang.String,int,java.lang.String)
public my.java.reflect.ReflectEntity()
-----指定 构造器-----
public my.java.reflect.ReflectEntity(int,java.lang.String,int,java.lang.String)
-----指定自己声明的 构造器-----
private my.java.reflect.ReflectEntity(int)
-----构造器参数-----
int arg0
java.lang.String arg1
int arg2
java.lang.String arg3
-----所有自己声明的方法-----
public java.lang.String my.java.reflect.ReflectEntity.toString()
public java.lang.String my.java.reflect.ReflectEntity.getAddress(java.lang.String)
private java.lang.String my.java.reflect.ReflectEntity.getName(java.lang.String)
public int my.java.reflect.ReflectEntity.getId(int)
public int my.java.reflect.ReflectEntity.getId()
public static void my.java.reflect.ReflectEntity.sex(java.lang.String)
public static void my.java.reflect.ReflectEntity.sex()
-----所有public指定的 方法-----
指定的方法 : public int my.java.reflect.ReflectEntity.getId()
-----所有  public 方法-----
public java.lang.String my.java.reflect.ReflectEntity.toString()
public java.lang.String my.java.reflect.ReflectEntity.getAddress(java.lang.String)
public int my.java.reflect.ReflectEntity.getId(int)
public int my.java.reflect.ReflectEntity.getId()
public static void my.java.reflect.ReflectEntity.sex(java.lang.String)
public static void my.java.reflect.ReflectEntity.sex()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
-----所有public指定的方法-----
指定的方法 : public int my.java.reflect.ReflectEntity.getId(int)
-----方法的所有参数-----
int arg0
 

3.   MyReflect02.java

package my.java.reflect;

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

/*
 * 反射实例化对象的两种方式
 * 
 */

public class MyReflect02 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
		
		//Class<ReflectEntity> clazz = ReflectEntity.class;
		Class<ReflectEntity> clazz = (Class<ReflectEntity>) Class.forName("my.java.reflect.ReflectEntity");
		
		//第一种实例化方式   使用newInstance
		ReflectEntity reflectEntity = clazz.newInstance();
		reflectEntity.getId();
		reflectEntity.getId(5);
		System.out.println(reflectEntity.toString());
		
		//第二种实例化方式     使用构造器
		Constructor<ReflectEntity> constructor = clazz.getDeclaredConstructor(int.class,String.class,int.class,String.class);
		ReflectEntity reflectEntity2 = constructor.newInstance(10,"张三",20,"中国");
		reflectEntity2.getId();
		reflectEntity2.getId(5);
		System.out.println(reflectEntity2.toString());
		
		//第二种实例化方式     使用构造器  private
		Constructor<ReflectEntity> constructorP = clazz.getDeclaredConstructor(int.class);
		constructorP.setAccessible(true);
		ReflectEntity reflectEntityP = constructorP.newInstance(10);
		reflectEntityP.getId();
		reflectEntityP.getId(5);
		System.out.println(reflectEntityP.toString());
		
		//执行method 方法
		Method method = clazz.getDeclaredMethod("getId",int.class);
		method.invoke(clazz.newInstance(), 10);
		
		Method methodP = clazz.getDeclaredMethod("getName",String.class);
		methodP.setAccessible(true);
		methodP.invoke(clazz.newInstance(), "张三");
	}
}

执行结果:

public 无参数构造器
public 无参数 方法
public 带参数 方法5
ReflectEntity [id=5, name=null, age=0, address=null]
public 带参数构造器
public 无参数 方法
public 带参数 方法5
ReflectEntity [id=5, name=张三, age=20, address=中国]
private 构造器
public 无参数 方法
public 带参数 方法5
ReflectEntity [id=5, name=null, age=0, address=null]
public 无参数构造器
public 带参数 方法10
public 无参数构造器
private 无参数 方法 name = 张三
 

© 著作权归作者所有

上一篇: java 动态代理
下一篇: java IO 操作总结
粉丝 1
博文 43
码字总数 25764
作品 0
西安
私信 提问

暂无文章

group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
31分钟前
0
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
42分钟前
2
0
java 序列化和反序列化

1. 概述 序列恢复为Java对象的过程。 对象的序列化主要有两 首先我们介绍下序列化和反序列化的概念: 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。...

edison_kwok
53分钟前
2
0
分布式数据一致性

狼王黄师傅
今天
2
0
经验

相信每位开发者在自己开发的过程中,都会反思一些问题,比如怎样提高编程能力、如何保持心态不砍产品经理、996 之后怎样恢复精力……最近开发者 Tomasz Łakomy 将他 7 年的开发生涯中学习到...

WinkJie
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部