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学习之反射的更多相关文章

  1. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  2. Java学习之反射篇

    Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...

  3. java学习之 反射

    以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习 ...

  4. java学习--Reflection反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  5. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

  6. 4 Java学习之 反射Reflection

    1. 反射概念  反射机制就是:动态地获取类的一切信息,并利用这些信息做一些你想做的事情. java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法. JAVA反射机制是在运行状态 ...

  7. Java学习:反射机制简介

    反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  8. Java学习_反射

    什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...

  9. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  10. 0034 Java学习笔记-反射-初步2-操作对象

    通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...

随机推荐

  1. 极客Web前端开发资源大荟萃

    前端开发已经成为当前炙手可热的技术之中的一个.本周我们除了给大家带技术相关资讯,另一些技术人员经常使用的站点.希望大家不要错过我们本周的内容.原文来自:极客标签 为神马说敲代码是非常艰难的 程序猿 做 ...

  2. docNet基础学完感想

    开学后的一个多月因为要准备acm省赛,所以docnet视频基本没看了!不过,虽然在省赛前每天都在做题,赛前刷了80多题吧!!但是比赛的时候就3题,渣啊!只做出了3个水题,后面两个小时搞两题就是出不来, ...

  3. ssh环境搭建并实现登录功能

    参照了这篇博客,但是里面有些地方进行了更改 http://wenku.baidu.com/link?url=edeegTquV2eR3CJ5-zvNcJbyuq11Afp-lD2Fz2jfmuHhV1 ...

  4. Linux字符界面和图形界面

    Ubuntu图形界面和字符界面的切换 Ubuntu和其他的Linux系统一样,有图形界面和字符界面,同时能够设置默认的启动界面. linux的显示界面分为命令行的字符界面和图形界面,我们可以设置lin ...

  5. Linux下 保存 git账号密码

    一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入内容格式: touch .git-credentials vim .git-crede ...

  6. java生成随机字符串

    学习java comparable特性时候,定义如下Student类,需要需要随机添加学生姓名以及学号和成绩,这是java如何随机生成名字,根据我的查询,我找到目前java库支持两种方法. 1. or ...

  7. shell学习-读取输入

    功能:读取输入,打印:如果长度小于MINLEN,那么输出空格. #!/bin/bash # paragraph-space.sh # Insert a blank line between parag ...

  8. 通过读取excel数据和mysql数据库数据做对比(二)-代码编写测试

    通过上一步,环境已搭建好了. 下面开始实战, 首先,编写链接mysql的函数conn_sql.py import pymysql def sql_conn(u,pwd,h,db): conn=pymy ...

  9. Firefox 备份

    参考http://mozilla.com.cn/post/32327/ 火狐的地址栏中输入about:support点击“打开所在文件夹”按钮,会弹出一个资源管理器,并且定位到你当前的Profile文 ...

  10. 导出Ext.grid.Panel到excel

    1.客户端定义,基本的想法是form提交表格头定义,数据,以json方式传输 Ext.grid.Panel.addMembers({ exportExcel:function(options){ if ...