java学习之反射
package com.gh.ref;
public class Person {
private String name;
private int age;
private char sex;
private void say(){
System.out.println("我是"+name);
}
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
public Person(String name, int age, char sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
System.out.println("调用Person有参构造方法");
}
public Person() {
super();
System.out.println("调用Person无参构造方法");
}
}
package com.gh.ref;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* 反射
* @author ganhang
*/
public class RefDemo {
public static void main(String[] args) throws Exception {
Person p=new Person("小白",18,'男');
Person p1=new Person("小黑",10,'女');
//创建Class对象方法一
Class personClass=p.getClass();
Class personClass1=p1.getClass();
System.out.println(personClass==personClass1);
/**
* true是因为java虚拟机先把Person.class通过类加载器加载到内存,加载到内存就是以Class类型存在的
* 但是两个对象只加载一次Person,所以他们的内存地址是 一样的;这和instanceof的功能本质一样
*/
//创建Class对象方法二
Class personClass3=Person.class;//一个Class对象代表一份字节码,相同类型的对象的字节码是一样的
System.out.println(personClass3==personClass1);
//int.class;
//void.class;
//创建Class对象方法三
Class personClass4=Class.forName("com.gh.ref.Person");//可能类找不到会抛异常,注意加包名
System.out.println(personClass4==personClass1);
//--------通过类信息实例化对象--------
//调用无参构造方法
Person p3;
try {
p3 = (Person)personClass4.newInstance();
System.out.println(p3);//因为调用无参构造所以全为空,如果类中没有无参构造方法将会报异常
} catch (InstantiationException | IllegalAccessException e1) {
e1.printStackTrace();
}
//调用有参构造方法
Constructor[] cons= personClass4.getConstructors();//获得当前类的所以构造方法
Person p4=null;
try {
//传指定参数的Class对象
Constructor c=personClass4.getConstructor(String.class,int.class,char.class);
p4=(Person) c.newInstance("小花",18,'女');
System.out.println(p4);
} catch (Exception e) {
e.printStackTrace();
}
//----------通过类取得类信息-------
System.out.println("包信息:"+personClass.getPackage().toString());//返回一个包类
System.out.println("类名:"+personClass.getName());
//获取类的方法信息
Method[] ms=personClass.getMethods();
/**
* 返回一个包含某些 Method 对象的数组,
* 这些对象反映此 Class 对象所表示的类或接口
*(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
* 如果只要本类自己定义方法(包括私有)可以用getDeclaredMethods()
*/
for (Method m : ms) {
//获取访问修饰符返回的是数字,需要Modifier来转
System.out.println("方法名"+Modifier.toString(m.getModifiers())+"-"+m.getName());
}
//获取类的属性信息,getDeclaredFields()获取私有
Field[] fs=personClass.getFields();//公有属性,Person没有
for (Field f : fs) {
System.out.println("属性名:"+f.getName());
}
System.out.println("---------调用方法--------");
try {
Method m=personClass4.getMethod("setName", String.class);
m.invoke(p4, "花花");
System.out.println(p4);
//如果调用私有方法say
Method m1=personClass4.getDeclaredMethod("say");//注意可以调私有方法的方法
m1.setAccessible(true);//忽略验证修饰符,让其对外可见
m1.invoke(p4);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("---------调用属性--------");
Field agef=personClass4.getDeclaredField("age");
agef.setAccessible(true);//忽略验证修饰符
System.out.println(agef.get(p4));//获得p4的年龄
agef.setInt(p4, 11);//设置p4的年龄值
System.out.println(p4);
}
}
java学习之反射的更多相关文章
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
- Java学习之反射篇
Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...
- java学习之 反射
以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习 ...
- java学习--Reflection反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- Java学习笔记--反射
什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...
- 4 Java学习之 反射Reflection
1. 反射概念 反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...
- Java学习:反射机制简介
反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- Java学习_反射
什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- 0034 Java学习笔记-反射-初步2-操作对象
通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...
随机推荐
- 文件下载Demo
知识点: //获取用户要下载的资源的名称 string name=context.Request.Params["downloadName"]; //设 ...
- 多个viewpager可能产生的问题
由于Fragment的方便性,现在很多人开始大量使用Fragment. 今天使用时遇到各问题,记录下来并分享下. 使用Fragment都会用FragmentActivity ,特别是在用到ViewPa ...
- 关于一个wpf中的定时器
http://www.cnblogs.com/royenhome/archive/2010/01/24/1655168.html
- removeCss
(function ($) { //删除元素行内style中单个style和多个style //示例: //$(".b").removeCss("color") ...
- highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度
highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度 作者:highcharts | 时间:2014-6-11 14:07:05 | [小 大] | ...
- web 性能优化指南阅读笔记
1.关于拥塞预防算法 PRR-比例降速,RFC6937 规定的一个新算法,其目标是改进丢包后的恢复速度,谷歌测量结果:该算法改进丢包造成的平均连接延迟减少了3%-10%.PRR是linux 3.2+内 ...
- 我的Fedora环境
Fedora现在也更新到了第20个版本,只是在15+以后的版本,大多数操作,都是大同小异的,也不必特意去关注版本号,只有对应到具体的软件,可能会因为库的版本,有或多或少的区别. 之前每次都喜欢按照一些 ...
- BZOJ 3038 上帝造题的七分钟2 (并查集+树状数组)
题解:同 BZOJ 3211 花神游历各国,需要注意的是需要开long long,还有左右节点需要注意一下. #include <cstdio> #include <cmath> ...
- BZOJ 1062
program candy bzoj1062; ; maxm=; maxn=; var n,len,m,i,p,t,l,r,c,d,q:longint; s:..,..maxn,..maxm] of ...
- Parsing HTML with C++ (using Qt preferably) - Stack Overflow
Parsing HTML with C++ (using Qt preferably) - Stack Overflow Parsing HTML with C++ (using Qt prefera ...