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()方法,前者要 ...
随机推荐
- Apache Mina开发手冊之四
Apache Mina开发手冊之四 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 一.Mina开发的主要步骤 1.创建一个实现了IoService接口 ...
- 练习笔记:net,JqueryUI实现自动补全功能
1.首先建立个空的Web项目 2.将下载好的JqueryUI文件保存到JS文件加下 3.引入JS文件 <link href="JS/css/ui-lightness/jquery-ui ...
- SQL数据库关键字和列名冲突处理
在设计SQL数据库的时候可能由于考虑不全,使列名和数据库内关键字冲突,可能导致Query不能被正确识别,对列名要加[]处理.
- USB数据流模型
USB数据流模型 <<USB Specification11>> << USB Specification20>> << Linux Dev ...
- C程序的存储空间布局
历史沿袭至今,C程序一直由下列几部分组成: 1. 正文段.这是由CPU执行的机器指令部分.通常,正文段是可共享的,所以即使是频繁执行的程序(编辑器,编译器,命令解释器)在存储器中也只需一个副本,另外正 ...
- Problem F: Exponentiation
Problem F: ExponentiationTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 4 Solved: 2[Submit][Status][W ...
- Lucence.net索引技术 二
一. Lucene索引创建和优化 [版本2.9.0以上] Lucene索引的创建首先需要取得几个必须的对象: 1.分词器//可以采用其他的中文分词器 StandardAnalyzer analyzer ...
- jenkins上集成fitnesse
烂笔头胜过好记性,恩,养成随手记的习惯 Fitnesse是完全有Java开发的测试框架,跨平台并且便于与其他测试框架和工具的合并(Jenkins.TestNG,Junit以及Selenium的集成) ...
- Python学习之字符串函数
下面是在看python核心编程中序列字符串中提到的一些函数,根据自己的学习理解总结了下,方便日后用到的时候查看. 1.string.capitalize() 把字符串的第一个字符大写 例子: ...
- 在IT公司,project manager 基本上和秘书,助理什么的差不多
我感觉非常有道理,所以我不做Leader,哈哈哈