java反射的几个方法区别

1. 通过Object类的getClass方法来获取
java.lang.Object中定义有getClass方法:public final Class getClass()
所有Java对象都具备这个方法,该方法用于返回调用该方法的对象的所属类关联的Class对象,例如:
Date date1 = new Date();
Date date2 = new Date();
Class c1 = date1.getClass();
Class c2 = date2.getClass();
System.out.println(c1.getName());
// java.util.Date
System.out.println(c1 == c2);
// true
上面的代码中,调用Date对象date1的getClass方法将返回用于封装Date类信息的Class对象。
这里调用了Class类的getName方法:public String getName(),这个方法的含义很直观,即返回所封装的类的名称。
需要注意的是,代码中的date1和date2的getClass方法返回了相同的Class对象(c1==c2的值为true)。这是因为,对于相同的类,JVM只会载入一次,而与该类对应的Class对象也只会存在一个,无论该类实例化了多少对象。
另外,需要强调的是,当一个对象被其父类的引用或其实现的接口类型的引用所指向时,getClass方法返回的是与对象实际所属类关联的Class对象。例如:
List list = new ArrayList();
System.out.println(list.getClass().getName()); // java.util.ArrayList
上面的代码中,语句list.getClass()方法返回的是list所指向对象实际所属类java.util.ArrayList对应的 Class对象而并未java.util.List所对应的Class对象。有些时候可以通过这个方法了解一个对象的运行时类型,例如:
HashSet set = new HashSet();
Iterator it = set.iterator();
System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator
从代码可以看出,HashSet的iterator方法返回的是实现了Iterator接口的HashMap内部类(KeyIterator)对象。
因为抽象类和接口不可能实例化对象,因此不能通过Object的getClass方法获得与抽象类和接口关联的Class对象。
2. 使用.class的方式
使用类名加“.class”的方式即会返回与该类对应的Class对象。例如:
Class clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
这个方法可以直接获得与指定类关联的Class对象,而并不需要有该类的对象存在。
3. 使用Class.forName方法
Class有一个著名的static方法forName:public static Class forName(String className) throws ClassNotFoundException
该方法可以根据字符串参数所指定的类名获取与该类关联的Class对象。如果该类还没有被装入,该方法会将该类装入JVM。
该方法声明抛出ClassNotFoundException异常。顾名思义,当该方法无法获取需要装入的类时(例如,在当前类路径中不存在这个类),就会抛出这个异常。

② java反射给字段赋值就是给实体类的set赋值,怎么做

亲,以下是我写的例子,你可以参考:
import java.lang.reflect.Field;
import java.util.Arrays;
import static java.lang.System.out;

enum Tweedle { DEE, DUM }

public class Book {
public long chapters = 0;
public String[] characters = { "Alice", "White Rabbit" };
public Tweedle twin = Tweedle.DEE;

public static void main(String... args) {
Book book = new Book();
String fmt = "%6S: %-12s = %s%n";

try {
Class<?> c = book.getClass();

Field chap = c.getDeclaredField("chapters");
out.format(fmt, "before", "chapters", book.chapters);
chap.setLong(book, 12);
out.format(fmt, "after", "chapters", chap.getLong(book));

Field chars = c.getDeclaredField("characters");
out.format(fmt, "before", "characters",
Arrays.asList(book.characters));
String[] newChars = { "Queen", "King" };
chars.set(book, newChars);
out.format(fmt, "after", "characters",
Arrays.asList(book.characters));

Field t = c.getDeclaredField("twin");
out.format(fmt, "before", "twin", book.twin);
t.set(book, Tweedle.DUM);
out.format(fmt, "after", "twin", t.get(book));

// proction code should handle these exceptions more gracefully
} catch (NoSuchFieldException x) {
x.printStackTrace();
} catch (IllegalAccessException x) {
x.printStackTrace();
}
}
}

输出:
BEFORE: chapters = 0
AFTER: chapters = 12
BEFORE: characters = [Alice, White Rabbit]
AFTER: characters = [Queen, King]
BEFORE: twin = DEE
AFTER: twin = DUM

如果对你有帮助的话,请点赞一下。如果有任何问题,都可以联系我!

③ Java反射问题

按照你的要求编写的用反射调用test方法的Java程序如下

Outter.java文件

public class Outter {

private Inner in;

public Outter(){

in=new Inner();

}

private class Inner {

private void test(){

System.out.println("test");

}

}

}

④ 什么是java反射技术,有没有核心代码

看个例子吧 也算不上核心 帮助理解下反射
package test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Admin {
public Admin(){ }
private String id = "";
public String getId() {
System.out.print(id);
return id;
}
public void setId(String id) {
this.id = id;
}

public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
String str = "test.Admin";
Class c = Class.forName(str);
Object obj = c.newInstance(); //得到Admin类
Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")}); //这里是设置属性的值的方法(setId方法名)
m.invoke(obj,new Object[]{"admin"}); //调用方法<实体类,参数>)
m = c.getMethod("getId",new Class[]{}); //这里是里获取属性的值
m.invoke(obj,new Object []{});
}
}

⑤ Java反射机制获取set()方法 并且为set()方法传值

package com.knowhowinfo;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test {
public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException, SecurityException, NoSuchMethodException {
Class<A> c = A.class;
//返回所有的方法
Method[] ms = c.getDeclaredMethods();
A a = c.newInstance();
for (Method method : ms) {
//这里遍历一下 可有可以无 实验而已
System.out.println(method);
}
Method m = c.getDeclaredMethod("set", int.class,String.class);
m.setAccessible(true);//因为写成private 所以这里必须设置
m.invoke(a, 5,"你好");

}
}
class A{
private void set(int i,String s){
System.out.println(i+","+s);
};
}这是效果图,相信你能看的懂

⑥ java反射机是否制扩大了访问范围,破坏了安全性

就算是反射也只能通过调用set方法来修改Salary的值啊

⑦ java反射如何为long型赋值

Method method=........;//如,bean 的 set方法

method.invoke(anObjectInstance, 1234L);

Field field = ........//如一个public 的属性
field.set(anObjectInstance, 1234L);

⑧ java反射怎么设置属性获取属性

Field 有方法 get/set
Object get(Object obj)Returns the value of the field represented by this Field, on
the specified object.
~~~~~~~~~~
void set(Object obj, Object value)Sets the field represented by this Field object on the
specified object argument to the specified new value.

~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

⑨ Java反射赋值会调用set方法吗

不会。set/get方法只是javaBean的规范,用来统一管理Bean属性的赋值操作。

⑩ 利用JAVA反射技术执行一个类的方法

public class Test {

public Test() {

}

public static void main(String[] args) throws IllegalArgumentException,
SecurityException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
Bean bean = new Bean();
System.out.println(bean);
Bean.class.getMethod("setName", String.class).invoke(bean, "Jerry");
Bean.class.getMethod("setAge", int.class).invoke(bean, 25);
System.out.println("After reflection....\n" + bean);
}

}

class Bean {
private String name;
private int age;

public Bean() {
}

public Bean(String name, int age) {
super();
this.name = name;
this.age = 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 "NAME: " + this.getName() + "\nAGE: " + this.getAge();
}
}