JAVA反射的基本使用

原创 2016年08月31日 15:27:44

下面直接通过列子的方法给出使用方法:

Employee:

package com.xiaoqi.reflect;

public class Employee {
	private String name;
	private int id;
	private boolean b;
	
	public Employee(String name, int id, boolean b) {
		super();
		this.name = name;
		this.id = id;
		this.b = b;
	}

	public String getName() {
		return name;
	}

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

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public boolean isB() {
		return b;
	}

	public void setB(boolean b) {
		this.b = b;
	}
}

EmployeeManager:

package com.xiaoqi.test;

import java.util.ArrayList;

public class EmployeeManager {
	private Employee employee;
	public ArrayList<Employee> employeeList;
	
	public void setParams(Employee employee,ArrayList<Employee> employeeList){
		this.employee = employee;
		this.employeeList = employeeList;
	}
	
	public static void setEmployee(){
		System.out.println("hahaha");
	}
	public EmployeeManager(){
		
	}
}

使用方式:

1、获取class的方式

			Class<?> class1 = Class.forName("com.xiaoqi.reflect.Employee");
			Class<?> class2 = Employee.class;
			Employee employee = new Employee("张三",1,false);
			Class<?> class3 = employee.getClass();

2、获取类的名称:

			//result:  public class Employee
			System.out.println(Modifier.toString(class3.getModifiers())+" class "+class3.getSimpleName());

3、获取字段名称类型 和 方法名称:

Field[] fields = class3.getDeclaredFields();
for(Field field:fields){
	//result: private String name
	//	      private int id
	//	      private boolean b
	System.out.println(Modifier.toString(field.getModifiers())+" "+field.getType().getSimpleName()+" "+field.getName());
	//获得具体的名称 如:java.lang.String 
	System.out.println(field.getType().getCanonicalName());
}
Method[] methods = class3.getDeclaredMethods();
//result :  public getName
//	public getId
//	public setName
//	public setB
//	public isB
//	public setId
for(Method m:methods){
	System.out.println(Modifier.toString(m.getModifiers())+" "+m.getName());
}

4、通过反射创建对象:

			Class<?> class1 = Class.forName("com.xiaoqi.reflect.Employee");
			Employee emp = (Employee) class1.newInstance();
			Constructor<Employee> con = (Constructor<Employee>) class3.getConstructor(String.class,  
	                int.class,boolean.class);  
			Employee obj = (Employee)con.newInstance("lxf", 23,true);  

5、创建对象并赋值:

		    //获取id属性  
		    Field idF = class1.getDeclaredField("id");  
		    //实例化这个类赋给o  
		    Object o = class1.newInstance();  
		    //打破封装  
		    idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
		    //给o对象的id属性赋值"110"  
		    idF.set(o, "110"); //set  

6、获取类的属性

                EmployeeManager manage = new EmployeeManager();
		Class employeeManager = manage.getClass();
		Field field = employeeManager.getDeclaredField("employee");
		field.setAccessible(true); //如果该字段是private,需要加上该方法
		
		Employee emp = (Employee) field.get(manage);
		Field field2 = employeeManager.getField("employeeList");
		//因为是静态的所以传入的是class
		ArrayList<Employee> list = (ArrayList<Employee>) field2.get(employeeManager);


7、通过method.invoke调用类方法

Employee employee = new Employee("张三",1,false);
Method method = employee.getClass().getMethod("setName", String.class);  
method.invoke(employee, "ckl");  


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

反射的应用与理解

反射就是把Java类中的各种成分映射成相应的java类 反射使用用中用到的是:字节码(获取类的字节码的三种方式) 例如:People p = new People(); 1:Class cl...

Java反射的用法详解

Java反射详解,如何通过反射获取类的私有属性,如何通过反射调用类的私有方法?

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

反射的基本使用

一、Class类 在java中,允许通过一个对象找到

反射的基本使用

在使用之前我们先想一下反射的作用,网上各种解读比较多,我认为反射的作用就是,当无法直接使用一个类的属性,构造器,方法时,我们通过反射来实现,反射可以获得一个类的所有信息。比如你想调用某个API,但是这...

反射的基本使用

反射就是把java类中的各种属性映射到另一个java类中,本以为我对反射还学得挺不错的,后来做着做着实验,发现杯具了。这个实验就是把一个类的所有东西打印出来,是的,所有,包括方法是如何具体实现的,然后...

JAVA反射的基本使用

下面直接通过列子的方法给出使用方法: Employee: package com.xiaoqi.reflect; public class Employee { private String ...

关于Java反射机制的总结

关于Java的反射机制,百度百科上是这样解释的:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动...

Class类的使用

//Foo实例如何表示 Foo foo1 = new Foo(); //foo1表示出来了//Foo 也是一个实例对象,Class类的实例对象,如何表示呢 //任何一个类都是Class的实...

反射的基本调用

首先编写一个一个类,编译生成库文件using System;using System.Collections.Generic;using System.Text; namespace ClassLib...

反射的基本使用实例

package com.franky.reflex; import java.lang.reflect.Constructor; import java.lang.reflect.Field; im...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)