一、實例化class
package com.reflect;
class X{
}
public class GetClassDemo01 {
public static void main(String[] args) {
Class<?> c1 = null; //指定泛型
Class<?> c2 = null;
Class<?> c3 = null;
try{
c1=Class.forName("com.reflect.X"); //1. 最常用的形式動態加載
}catch(ClassNotFoundException e){
e.printStackTrace();
}
c2 = new X().getClass(); //2. 通過object類中的方法實例
c3=X.class; //3. 通過類.class實例化
System.out.println(c1.getName()); //得到類的名稱
System.out.println(c2.getName());
System.out.println(c3.getName());
}
}
com.reflect.X
com.reflect.X
com.reflect.X
無參構造實例化對象:
package com.reflect;
//使用newinstance()方法實例化其他類對象,必須保證實例化的類中存在一個無參構造函數
class Person{
private String name;
private int age;
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 String toString(){
return "姓名:"+this.name+",年齡:"+this.age;
}
}
public class InstanceDemo {
public static void main(String[] args) {
Class<?> c = null; //指定泛型
try{
c=Class.forName("com.reflect.Person");//傳入要實例化類的完整包.類名稱
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Person per= null; //聲明person對象
try{
per=(Person) c.newInstance(); //實例化person類對象
}catch(Exception e){
e.printStackTrace();
}
per.setName("YQ");
per.setAge(18);
System.out.println(per);
}
}
姓名:YQ,年齡:18
有參構造實例化:操作步驟:
1.通過class類中的getConstructors()取得本類中的全部構造方法
2.向構造方法中傳遞一個對象數組,里面包含了構造方法中所需的各個參數
3.之后通過Constructor實例化對象
package com.reflect;
import java.lang.reflect.Constructor;
class Persons{
private String name;
private int age;
public Persons(String name,int age){
this.setName(name);
this.setAge(age);
}
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 String toString(){
return "姓名:"+this.name+",年齡:"+this.age;
}
}
public class InstanceDemo02 {
public static void main(String[] args) {
Class<?> c = null;
try{
c=Class.forName("com.reflect.Persons");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Persons per = null;
Constructor<?> cons[] =null; //聲明一個表示構造方法的數組
cons=c.getConstructors(); //通過反射取得全部構造
try{
per=(Persons) cons[0].newInstance("YQ",20); //向構造方法中傳遞參數,因為只有一個構造,所以數組下標為0
}catch(Exception e){
e.printStackTrace();
}
System.out.println(per);
}
}
姓名:YQ,年齡:20
二、反射的應用:
Constructor:表示類中的構造方法
Field:表示類中的屬性
Method:表示類中的方法
package com.getinterfac;
interface China {
public String NATIONAL="China"; //定義全局常量
public String AUTHOR="YQ";
public void sayChina(); //定義無參抽象方法
public String sayHello(String name,int age); //定義有參抽象方法
}
package com.getinterfac;
public class Person1 implements China{
private String name;
private int age;
public Person1(){
}
public Person1(String name,int age){
this.setAge(age);
this.setName(name);
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
public void sayChina(){
System.out.println("作者:"+AUTHOR+",國家:"+NATIONAL);
}
public String sayHello(String name,int age){
return name+",你好!我今年"+age+"歲了!";
}
}
取得所實現的Person類全部接口:
package com.getinterfac;
import java.lang.reflect.Constructor;
public class GetInterfaceDemo {
public static void main(String[] args) {
Class<?> c = null;
try{
c=Class.forName("com.getinterfac.Person1"); //傳入要實例化類的完整包.類名稱
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Class<?> c1[] = c.getInterfaces(); //取得實現的全部接口
for(int i=0; i<c1.length; i++){
System.out.println("實現的接口名稱:"+c1[i].getName());
}
Class<?> c2 = c.getSuperclass();
System.out.println("取得person父類接口名稱:"+c2.getName());
Constructor<?> con[] = c.getConstructors();
for(int i=0 ;i<con.length;i++){
System.out.println("取得person類中全部的構造方法:"+con[i]);
}
}
}
實現的接口名稱:com.getinterfac.China
取得person父類接口名稱:java.lang.Object
取得person類中全部的構造方法:public com.getinterfac.Person1()
取得person類中全部的構造方法:public com.getinterfac.Person1(java.lang.String,int)
取得一個類的全部構造方法:
package com.getinterfac;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
//取得類中全部的構造方法
public class GetInterfaceDemo02 {
public static void main(String[] args) {
Class<?> c = null;
try{
c=Class.forName("com.getinterfac.Person1");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Constructor<?> cons[] = c.getConstructors(); //取得全部構造
for(int i=0;i<cons.length;i++){ //循環輸出
System.out.print("構造方法:");
int mo = cons[i].getModifiers();
System.out.print(Modifier.toString(mo)+"@ ");
System.out.print(cons[i].getName()); //取出構造方法名稱
System.out.print("(");
Class<?> p[] = cons[i].getParameterTypes(); //列出構造中的參數類型
for(int j=0;j<p.length;j++){
System.out.print(p[j].getName()+" arg"+i);//打印參數類型
if(j<p.length-1){ //判斷是否輸出
System.out.print(",");
}
}
System.out.println("){}");
}
}
}
構造方法:public@ com.getinterfac.Person1(){}
構造方法:public@ com.getinterfac.Person1(java.lang.String arg1,int arg1){}
取得一個類全部方法定義:
package com.getinterfac;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class GetMethodDemo {
public static void main(String[] args) {
Class<?> c = null;
try{
c=Class.forName("com.getinterfac.Person1");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Method m[]= c.getMethods(); //取得全部的方法
for(int i=0 ;i<m.length;i++){
Class<?> r=m[i].getReturnType(); //得到方法的返回值類型
Class<?> p[] = m[i].getParameterTypes();//得到全部的參數類型
int xx=m[i].getModifiers(); //得到方法的修飾符
System.out.print(Modifier.toString(xx)+" ");//還原修飾符
System.out.print(r.getName()+" "); //得到方法名稱
System.out.print(m[i].getName()+" "); //取得方法名稱
System.out.print("(");
for(int x=0;x<p.length;x++){
System.out.print(p[x].getName()+" "+"arg"+x);//輸出參數
if(x<p.length-1){ //判斷是否輸出
System.out.print(",");
}
}
Class<?> ex[] = m[i].getExceptionTypes(); //得到全部的異常拋出
if(ex.length>0){ //判斷是否有異常
System.out.print(")throws ");
}else{
System.out.print(")");
}
for(int j=0 ;j<ex.length;j++){
System.out.print(ex[j].getName()); //輸出異常信息
if(j<ex.length-1){ //判斷是否輸出
System.out.print(",");
}
}
System.out.println();
}
}
}
public java.lang.String getName ()
public void setName (java.lang.String arg0)
public void sayChina ()
public int getAge ()
public void setAge (int arg0)
public java.lang.String sayHello (java.lang.String arg0,int arg1)
public final void wait (long arg0,int arg1)throws java.lang.InterruptedException
public final native void wait (long arg0)throws java.lang.InterruptedException
public final void wait ()throws java.lang.InterruptedException
public boolean equals (java.lang.Object arg0)
public java.lang.String toString ()
public native int hashCode ()
public final native java.lang.Class getClass ()
public final native void notify ()
public final native void notifyAll ()
取得person類中的全部屬性:
package com.getinterfac;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class GetFieldDemo {
public static void main(String[] args) {
Class<?> c = null;
try{
c=Class.forName("com.getinterfac.Person1");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
{
Field f[] = c.getDeclaredFields(); //取得本類屬性
for(int i=0;i<f.length;i++){
Class<?> r = f[i].getType(); //取得屬性的類型
int mo = f[i].getModifiers(); //得到修飾符數字
String priv = Modifier.toString(mo);//取得屬性的修飾符
System.out.print("本類屬性:"+priv+" ");//輸出修飾符
System.out.print(r.getName()+" ");//輸出屬性類型
System.out.print(f[i].getName());//輸出屬性名稱
System.out.println(";");
}
}
{
Field f[] =c.getFields();
for(int i=0;i<f.length;i++){
Class<?> r = f[i].getType(); //取得屬性的類型
int mo = f[i].getModifiers(); //得到修飾符數字
String priv = Modifier.toString(mo);//取得屬性的修飾符
System.out.print("公共屬性:"+priv+" ");//輸出修飾符
System.out.print(r.getName()+" ");//輸出屬性類型
System.out.print(f[i].getName());//輸出屬性名稱
System.out.println(";");
}
}
}
}
本類屬性:private java.lang.String name;
本類屬性:private int age;
公共屬性:public static final java.lang.String NATIONAL;
公共屬性:public static final java.lang.String AUTHOR;
調用Person類中的sayChina()、sayHello()方法:
package test;
import java.lang.reflect.Method;
public class InvokeSayChina {
public static void main(String[] args) {
Class<?> c =null;
try{
c=Class.forName("test.Person1");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
Method m = c.getMethod("sayChina");
m.invoke(c.newInstance());
}catch(Exception e){
e.printStackTrace();
}
try{
Method m2 = c.getMethod("sayHello", String.class,int.class);
String s = null;
s=(String) m2.invoke(c.newInstance(), "YQ",20);
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}
}
}
作者:YQ,國家:China
YQ,你好!我今年20歲了!
調用person類中的setter、getter方法:
package com.getinterfac;
import java.lang.reflect.Method;
public class InvokeSetGetDemo {
public static void setter(Object obj,String st,Object value,Class<?> type){
try{
Method m = obj.getClass().getMethod("set"+initStr(st), type);
m.invoke(obj, value);
}catch(Exception e){
e.printStackTrace();
}
}
public static void getter(Object obj,String st){
try{
Method m = obj.getClass().getMethod("get"+initStr(st));
System.out.println(m.invoke(obj));
}catch(Exception e){
e.printStackTrace();
}
}
private static String initStr(String old) {
String str = old.substring(0,1).toUpperCase()+old.substring(1);
return str;
}
public static void main(String[] args) {
Class<?> c = null;
Object obj = null;
try{
c=Class.forName("com.getinterfac.Person1");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
obj=c.newInstance();
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}
setter(obj, "name", "YQ", String.class);
setter(obj, "age", 30, int.class);
System.out.print("姓名:");
getter(obj,"name");
System.out.print("年齡:");
getter(obj,"age");
}
}
姓名:YQ
年齡:30
直接操作類中的屬性:
package com.getinterfac;
import java.lang.reflect.Field;
public class InvokeFieldDemo {
public static void main(String[] args) throws Exception{
Class<?> c = null;
Object obj = null;
try{
c=Class.forName("com.getinterfac.Person1");
obj=c.newInstance();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Field nameField=c.getDeclaredField("name"); //取得name屬性
Field ageField=c.getDeclaredField("age"); //取得age屬性
nameField.setAccessible(true); //將name屬性設置成可被外部訪問
nameField.set(obj, "YQ");
ageField.setAccessible(true); //將age屬性設置成可被外部訪問
ageField.set(obj, 20);
System.out.println("姓名:"+nameField.get(obj));//通過get取得屬性內容
System.out.println("年齡:"+ageField.get(obj)); //通過get取得屬性內容
}
}
姓名:YQ
年齡:20
認真看過此篇的小伙伴,如果對你有收獲,請點擊旁邊的小手推薦一下,如果有誤,歡迎指正,謝謝!
版權聲明:此篇為本人原創,轉載請標明出處https://www.cnblogs.com/YQian/p/10930788.html
我的博客園地址:https://www.cnblogs.com/YQian/