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()方法,前者要 ...
随机推荐
- Android应用开发基础篇(2)-----Notification(状态栏通知)
一.概述 Notification这个部件的功能是在状态栏里显示消息提醒,比如有未读的短信或者是未接的电话,那么状态栏里都会有显示,更或者是从某个应用(比如QQ,酷我音乐等等)里按Home键 ...
- .NET连接SAP系统专题:.NET调用RFC几种方式(一)
本来今天是要写一篇关于NCO3.0的东西,就是关乎.NET调用SAP的RFC的,支持VS2010和.NET 4.0等.现在网上到处都是充斥着NCO1.X和NCO2.0,需要用VS2003来使用,都是一 ...
- JS图表组件 highcharts 简单的介绍
把highcharts拿来做个简单的介绍,希望更多的朋友可以用到这个用来做图表的js插件. preparation Highcharts Highcharts是一个制作图表的纯Javascript类库 ...
- 编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。
package cn.itcast; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public ...
- KMP算法的一次理解
1. 引言 在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了.KMP本身不复杂,但网上绝大部分的文章把它讲混乱了.下面,咱们从暴力匹配算法讲起,随 ...
- Hibernate学习之hql查询语句
* 页面上数据的字段和数据库中字段差不多,这个时候,采用迫切连接 结构比较好,如果页面上的字段很少,要按照需求加载数据,采用带构造函数的select查询 实例讲解:转自:http://www.cn ...
- jmeter 通过ant集成到jenkins
jmeter可以通过ant自动执行测试脚本,然后集成到jenkins上,并发送测试报告 1.下载安装ant 2.将jmeter安装包extras文件夹里ant-jemter-1.1.1.jar 复制到 ...
- Oracle Primavera P6 R84单机版安装教程
本教程用于指导Oracle Primavera P6 R84版本的单机版安装过程.P6 R84版本于2014年9月30日发布.其功能较之前版本有较大提升.单机版的安装方式也发生了很大的变化.P6 R8 ...
- Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)
Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...
- srm 534
250 Description 给你一个1*n的棋盘.两人轮流行动,每一个人能够把"o"向右移动到空格子.或者跨越连续两个"o"到空格子. 一个"o& ...