Java反射机制(二)
来源:互联网 发布:恒生估值系统 数据库 编辑:程序博客网 时间:2024/05/18 00:58
Java反射机制的深入应用
1.通过反射调用类中的方法
(1)通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法所需要的参数类型
(2)用invoke调用,并向方法中传递设置的参数
范例:
/*
* 定义一个Person类,其中有name和age属性,say()方法
*/
package com.zgy.reflect;
public 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 Person()
{
}
public String say(String name,int age)
{
return name+"你好,"+age+"年龄";
}
}
package com.zgy.reflect;
import java.lang.reflect.Method;
public class Invoke
{
public static void main(String[] args)
{
Class<?> c = null;
try
{
c = Class.forName("com.zgy.reflect.Person");//取得Person类,实例化Class
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Method m = c.getMethod("say", String.class,int.class);//获取say()方法,此方法需要两个参数
String str = null;
str = (String)m.invoke(c.newInstance(), "张三",24);//调用invoke()方法,传递一个对象实例和两个参数
System.out.println(str);
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
2.通过反射操作属性
在反射机制中可以使用Filed类操作类中的属性,通过Field类提供的set()方法和get()方法就可以完成设置属性和取得属性的操作。
但是在类中的属性都应该是设置了private属性的,所以在使用Field类的set()和get()方法时,首先要使用Field类中的setAccessible(true)
将要操纵的属性设置为外部可以访问。
(类中的属性应当设置为private,此处只是范例。真是开发中不建议改变属性的访问权限)
package com.zgy.reflect;
/*
* 定义一个Person类,其中有name和age属性,say()方法
*/
public 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 Person()
{
}
public String say(String name,int age)
{
return name+"你好,"+age+"年龄";
}
}
package com.zgy.reflect;
import java.lang.reflect.Field;
public class InvokeTest
{
public static void main(String[] args)
{
Class<?> c = null;
try
{
c = Class.forName("com.zgy.reflect.Person");//获取Person类的路径,实例化Class类
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Object obj = c.newInstance();
Field fieldName = c.getDeclaredField("name");//取得name属性
Field fieldAge = c.getDeclaredField("age");//取得age属性
fieldName.setAccessible(true);//将Name属性设置为外部可以访问
fieldAge.setAccessible(true);//将age属性设置为外部可以访问
fieldName.set(obj, "张三");//设置name属性的值为张三
fieldAge.set(obj, 24);//设置age属性的值为24
System.out.println("姓名"+fieldName.get(obj));
System.out.println("年龄"+fieldAge.get(obj));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
3.通过反射操纵数组
获取数组的Class对象的方法:
public Class<?> getComponentType()
在java.lang.reflect包中,使用Array类表示一个数组。Array类的常用方法:
public static Object get(object array,int index) throws IllegalArgumentException,ArrayIndexOutOfBoundsException//根据下标取得数组内容
public static Object newInstance(Class<?> componentType,int length) throws NegativeArraySizeException//根据已有的数组类型开辟新的数组
public static void set(Object array,int index,Object value) throws IllegalArgumentException,ArrayIndexOutOfBoundsException//修改指定位置内容
范例:
package com.zgy.reflect;
import java.lang.reflect.Array;
public class ClassArray
{
public static void main(String[] args)
{
int temp[] = {1,2,3};
Class<?> c = temp.getClass().getComponentType();//取得数组的Class对象
System.out.println(c.getName());//取得数组的名称
System.out.println(Array.getLength(temp));//取得数组的长度
System.out.println(Array.get(temp, 0));//取得数组的第一个内容
Array.set(temp, 0, 0);//取得数组的第一个内容
System.out.println(Array.get(temp,0));
}
}
范例:
扩大数组的长度
package com.zgy.reflect;
import java.lang.reflect.Array;
public class ArrayChangeLength
{
public static void main(String[] args)
{
int[] arr = {1,2,3,4,5};
int[] newarr = (int[])arrayChange(arr,10);
for(int x : newarr)
{
System.out.print(x+" ");
}
}
/*
* 修改数组长度的方法
* 方法有2个参数,参数1为原数组,参数2为扩大的长度
*/
public static Object arrayChange(Object obj,int len)
{
Class<?> c = obj.getClass().getComponentType();//得到数组的Class对象
Object newarray = Array.newInstance(c, 10);//开辟新的数组,并指定大小
int lenold = Array.getLength(obj);//取得原数组的长度
System.arraycopy(obj, 0, newarray, 0, lenold);
return newarray;
}
1.通过反射调用类中的方法
(1)通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法所需要的参数类型
(2)用invoke调用,并向方法中传递设置的参数
范例:
/*
* 定义一个Person类,其中有name和age属性,say()方法
*/
package com.zgy.reflect;
public 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 Person()
{
}
public String say(String name,int age)
{
return name+"你好,"+age+"年龄";
}
}
package com.zgy.reflect;
import java.lang.reflect.Method;
public class Invoke
{
public static void main(String[] args)
{
Class<?> c = null;
try
{
c = Class.forName("com.zgy.reflect.Person");//取得Person类,实例化Class
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Method m = c.getMethod("say", String.class,int.class);//获取say()方法,此方法需要两个参数
String str = null;
str = (String)m.invoke(c.newInstance(), "张三",24);//调用invoke()方法,传递一个对象实例和两个参数
System.out.println(str);
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
2.通过反射操作属性
在反射机制中可以使用Filed类操作类中的属性,通过Field类提供的set()方法和get()方法就可以完成设置属性和取得属性的操作。
但是在类中的属性都应该是设置了private属性的,所以在使用Field类的set()和get()方法时,首先要使用Field类中的setAccessible(true)
将要操纵的属性设置为外部可以访问。
(类中的属性应当设置为private,此处只是范例。真是开发中不建议改变属性的访问权限)
package com.zgy.reflect;
/*
* 定义一个Person类,其中有name和age属性,say()方法
*/
public 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 Person()
{
}
public String say(String name,int age)
{
return name+"你好,"+age+"年龄";
}
}
package com.zgy.reflect;
import java.lang.reflect.Field;
public class InvokeTest
{
public static void main(String[] args)
{
Class<?> c = null;
try
{
c = Class.forName("com.zgy.reflect.Person");//获取Person类的路径,实例化Class类
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Object obj = c.newInstance();
Field fieldName = c.getDeclaredField("name");//取得name属性
Field fieldAge = c.getDeclaredField("age");//取得age属性
fieldName.setAccessible(true);//将Name属性设置为外部可以访问
fieldAge.setAccessible(true);//将age属性设置为外部可以访问
fieldName.set(obj, "张三");//设置name属性的值为张三
fieldAge.set(obj, 24);//设置age属性的值为24
System.out.println("姓名"+fieldName.get(obj));
System.out.println("年龄"+fieldAge.get(obj));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
3.通过反射操纵数组
获取数组的Class对象的方法:
public Class<?> getComponentType()
在java.lang.reflect包中,使用Array类表示一个数组。Array类的常用方法:
public static Object get(object array,int index) throws IllegalArgumentException,ArrayIndexOutOfBoundsException//根据下标取得数组内容
public static Object newInstance(Class<?> componentType,int length) throws NegativeArraySizeException//根据已有的数组类型开辟新的数组
public static void set(Object array,int index,Object value) throws IllegalArgumentException,ArrayIndexOutOfBoundsException//修改指定位置内容
范例:
package com.zgy.reflect;
import java.lang.reflect.Array;
public class ClassArray
{
public static void main(String[] args)
{
int temp[] = {1,2,3};
Class<?> c = temp.getClass().getComponentType();//取得数组的Class对象
System.out.println(c.getName());//取得数组的名称
System.out.println(Array.getLength(temp));//取得数组的长度
System.out.println(Array.get(temp, 0));//取得数组的第一个内容
Array.set(temp, 0, 0);//取得数组的第一个内容
System.out.println(Array.get(temp,0));
}
}
范例:
扩大数组的长度
package com.zgy.reflect;
import java.lang.reflect.Array;
public class ArrayChangeLength
{
public static void main(String[] args)
{
int[] arr = {1,2,3,4,5};
int[] newarr = (int[])arrayChange(arr,10);
for(int x : newarr)
{
System.out.print(x+" ");
}
}
/*
* 修改数组长度的方法
* 方法有2个参数,参数1为原数组,参数2为扩大的长度
*/
public static Object arrayChange(Object obj,int len)
{
Class<?> c = obj.getClass().getComponentType();//得到数组的Class对象
Object newarray = Array.newInstance(c, 10);//开辟新的数组,并指定大小
int lenold = Array.getLength(obj);//取得原数组的长度
System.arraycopy(obj, 0, newarray, 0, lenold);
return newarray;
}
}
0 0
- Java反射机制(二)
- java反射机制(二)
- Java反射机制(二)
- JAVA反射机制(二)
- java反射机制(二)
- Java反射机制二
- 《Java》-----反射机制二
- Java反射机制二
- 候捷谈Java反射机制(二)
- 候捷谈Java反射机制(二)
- 候捷谈Java反射机制(二)
- java的method反射机制(二)
- 通俗易懂解释java反射机制(二)
- Java学习 反射机制(二)
- java基础知识(二)--反射机制
- Java反射机制梳理(二)
- 初识 java 反射机制 (二)
- Java反射机制 初步(二)
- Java IO流学习总结
- iOS之动态获取字符串的size
- 待买书籍
- 1 Unix/Linux平台上编程的 基本系统数据类型
- [Java]读取文件方法大全
- Java反射机制(二)
- 擅长排列的小明(南阳19)(DFS)
- 黑马程序员_JAVA面向对象基础
- 内容观察者复习-监听短信demo
- 2.23 不要让类型默默转换
- Python箴言
- 装饰模式
- C连接
- Palindromic Number