2012-04-25 11 views
5
java.lang.NoSuchFieldException: id 

Aşağıdaki satır istisna oluşturuyor.NoSuchFieldException getClass(). GetField()

String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory)); 

studyplanCategory geçerli bir nesnedir ve gerçek değerleri vardır. Bu istisnanın Beacuse yük metodu ve JSF webapp'ımın LazyLoading DataTable'ındaki arama fonksiyonu çalışmıyor. Class.getField(...) için Javadoc itibaren

cevap

7

onun görmez çünkü Uygulaması bu istisna ateşlerse geri vermek istediğin şeyi atlatır. Yöntem getField() özel olmayan öznitelikleri döndürür, böylece öznitelikleriniz özelse, yöntem bunları görmez. http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html

'u kontrol edebilirsiniz. Böylece, atıflarınızın korumalı veya herkese göre değişeceğini ve sonra doğru şekilde çalışmasını sağlayabilirsiniz. Ancak bu şekilde (asıl örneklerde olduğu gibi) gerçek veritabanını simüle eder. Bu liste, yalnızca gerçek veritabanıyla simüle edilmesini sağlamak için . Eğer kullanmak istiyorsan. böylece, fasulye sınıfını destekleyerek bunu yapıyorsunuz ve bunu yapıyorsunuz. Bağlantıyı zaten bir filtreyle açarsınız veya yapmazsınız ve veriyi veri tabanından döndürürsünüz.

// DÜZENLEME: Adam, getDeclaredField() kullanmanız gerektiğini yazdı, ancak bunu denedim ve iyi çalışmadı ve IlegalAccessException'ı atar. Bir pretype özniteliği korumalı olduğunda, iyi çalışır. Nedenini bilmiyorum.getClass().getField() sorun için

+0

Merhaba Ama korumalı çalışırken bile istisna var.Özellik oluştu atjava.lang.IllegalAccessException: Sınıf com.buddhiedge.server.model.StudyPlanLazyDataModel değiştirici ile sınıf com.buddhiedge.server.entity.StudyplanCategory üyesi erişemez " korumalı " – user1281029

+0

Merhaba Çalışan kamu erişim belirteci, ancak DATABASE TABLOSU (bu durumda) üye alanlarını özel olarak tutmamız gereken kurallara aykırıdır. – user1281029

+0

Adamım aynı sorunu yaşadım ancak değiştirilen bir özellik korunurken, IllegalAccessEception iletisi daha fazla gösterilmiyordu. Bu yüzden onu kamuya değiştirmeyi deneyin. İşe yaramalı. Algı zaten field.setAccessible (true) gibi bir çözüm yazdı; Ama sonra, backing fasulye sınıfında, yeni LazyDataModel sınıfını oluşturacak @PostConstruct içinde yapmaya çalışın ve orada filtre ve deyim ile zaten veritabanınız için deyim oluşturur filtre verilere dönecektir, "tembel yükleme". – Sajmon

18

:

belirtilen kamu üyesi alanını bu Sınıfı nesnesi tarafından temsil edilen sınıf veya arayüzünün yansıtan bir alan nesnesi döndürür. parametresi, istenen alanın basit adını belirten bir String'dir. Yansıtılacak alan, aşağıdaki algoritma tarafından belirlenir. Bu nesne tarafından temsil edilen sınıf olsun:

C, belirtilen alana sahip bir genel alan bildirirse, bu yansıtılacak olan alanıdır. Yukarıdaki 1. adımda herhangi bir alan bulunmadıysa, bu algoritması, her bir direkt süperinter yüzeyine tekrar tekrar uygulanır. Doğrudan süper-tarayıcılar, bildirildikleri sırayla aranır. Yukarıdaki 1. ve 2. adımlarda herhangi bir alan bulunmadıysa ve C bir süper sınıfı S'ye sahipse, bu algoritma S üzerinde yinelemeli olarak çağrılır. Eğer C hiçbir üst sınıfı içermiyorsa, bir NoSuchFieldException atılır. Java Dil Belirtimi, bölüm 8.2 ve 8.3'e bakın. Eğer kurtarmaya çalışmaktadırlar alan üzerinden ise

:

studyplanCategory.getClass().getField(filterProperty) 

özeldir, o zaman bir NoSuchFieldException alacak. Bir alan yoluyla bu şekilde değerleri belirlerken

studyplanCategory.getClass().getDeclaredField(filterProperty) 

Ve potansiyel yasadışı erişim istisnalar aşmanın: özel alanlar için ise bu deneyin

Field field = studyplanCategory.getClass().getDeclaredField(filterProperty); 
field.setAccessible(true); 
field.get(studyplanCategory); 
+0

Merhaba ben zaten soruna almış olabilir gibi şimdi java.lang.IllegalAccessException – user1281029

+0

değiştirildi istisna görünüyor olduğunu çalıştı, ancak her durumda nasıl için düzenlemeleri görmek yasadışı erişim istisnasıyla geçin. – Perception

1

En çözeltilerdir: yerine arasında

kullanımlar getDeclaredField() getField()

1)

String propertyName = "test";<br/> 
Class.forName(this.getClass().getName()).getDeclaredField(propertyName); 

2)

String propertyName = "name";<br/> 
Replace **"HelloWorld"** with your class name<br/> 
HelloWorld.class.getDeclaredField(propertyName) 
0

Aynı problemle karşılaştım. Sorunum değişkenlerim genel değil. Sınıf değişkenleri kamu olduğundan emin olun

private Object getVariableValue(Object clazz, String variableName) { 
    try { 
     Field field = clazz.getClass().getField(variableName); 
     return field.get(clazz); 
    } catch (NoSuchFieldException e) { 
     return ""; 
    } catch (IllegalAccessException e) { 
     return ""; 
    } 

} 
İlgili konular